2009-03-25 5 views
17

मेरे पास एक उम्मीद स्क्रिप्ट है जो एसएसएच के माध्यम से कुछ राउटर से जुड़ती है। इन सभी राउटर में एक ही पासवर्ड है (मुझे पता है, यह गलत है), और स्क्रिप्ट को राउटर से कनेक्ट करने में सक्षम होने के लिए उस पासवर्ड को जानने की आवश्यकता है। वर्तमान में, पासवर्ड मेरी स्क्रिप्ट को कमांड लाइन पर एक तर्क के रूप में पास किया गया है, लेकिन इसका मतलब है कि मेरे .bash_history फ़ाइल के साथ-साथ चल रही प्रक्रियाओं में उस पासवर्ड का एक निशान है। इसलिए मैं चुपचाप चुपचाप उपयोगकर्ता को पासवर्ड के लिए संकेत देना चाहूंगा।मैं पासवर्ड के लिए एक स्क्रिप्ट प्रॉम्प्ट कैसे कर सकता हूं?

क्या आप जानते हैं कि उपयोगकर्ता को पासवर्ड के साथ पासवर्ड के लिए संकेत देना संभव है या नहीं?

धन्यवाद।

संपादित करें: यदि मैं राउटर के बजाय सर्वर से कनेक्ट कर रहा था, तो शायद मैं पासवर्ड के बजाय एसएसएच कुंजी का उपयोग करता। लेकिन राउटर जो मैं उपयोग कर रहा हूं बस पासवर्ड का समर्थन कर रहा हूं।

उत्तर

28

उपयोग उम्मीद है इस तरह stty आदेश:

# grab the password 
stty -echo 
send_user -- "Password for [email protected]$host: " 
expect_user -re "(.*)\n" 
send_user "\n" 
stty echo 
set pass $expect_out(1,string) 

#... later 
send -- "$pass\r" 

ध्यान दें कि यह बुला send_user से पहले stty -echoकॉल करने के लिए महत्वपूर्ण है - मुझे यकीन है कि नहीं कर रहा हूँ वास्तव में क्यों: मुझे लगता है कि यह एक समय मुद्दा है।

उम्मीद प्रोग्रामर सभी पढ़ना चाहिए पुस्तक: डॉन लाइब्स से अपेक्षा की खोज

+2

कूल धन्यवाद! यह आश्चर्यजनक है कि यह भाषा कितनी असहिष्णु है: मैंने "स्ट्रिंग" शब्द से पहले एक स्थान के साथ "$ pass_out (1, स्ट्रिंग) पास करें" लिखा है, और यह बम है। मुझे या तो बहुत अधिक दस्तावेज नहीं मिल रहा है। मेरी इच्छा है कि उम्मीद से कुछ और समाधान हो। वैसे भी, बहुत बहुत धन्यवाद। – MiniQuark

+0

"ज्यादा दस्तावेज नहीं मिल रहा है"?! एक पूरी किताब है, जिसे आम तौर पर इतना अच्छी तरह से लिखा जाता है कि इसे दूसरे संस्करण की आवश्यकता नहीं है। गंभीरता से, उस पुस्तक को देखें। –

+1

पुन: "1," और "स्ट्रिंग" के बीच एक स्थान - टीसीएल (और इसलिए उम्मीद है) में बहुआयामी सरणी नहीं है। सरणी कुंजी सिर्फ एक स्ट्रिंग है, और "1, स्ट्रिंग" और "1, स्ट्रिंग" अलग हैं। –

6

ठीक है, ऊपर 2 जवाब विलय (या नीचे या जहाँ भी वे अब कर रहे हैं!):

#!/usr/local/bin/expect 
log_user 0 
set timeout 10 
set userid "XXXXX" 
set password "XXXXXX" 

# ############## Get two arguments - (1) Device (2) Command to be executed 
set device [lindex $argv 0] 
set command [lindex $argv 1] 

# grab the password 
stty -echo 
send_user -- "Password for [email protected]$host: " 
expect_user -re "(.*)\n" 
send_user "\n" 
stty echo 
set pass $expect_out(1,string) 

spawn /usr/local/bin/ssh -l $userid $device 
match_max [expr 32 * 1024] 

expect { 
    -re "RSA key fingerprint" {send "yes\r"} 
    timeout {puts "Host is known"} 
} 

expect { 
    -re "username: " {send "$userid\r"} 
    -re "(P|p)assword: " {send "$pass\r"} 
    -re "Warning:" {send "$pass\r"} 
    -re "Connection refused" {puts "Host error -> $expect_out(buffer)";exit} 
    -re "Connection closed" {puts "Host error -> $expect_out(buffer)";exit} 
    -re "no address.*" {puts "Host error -> $expect_out(buffer)";exit} 

    timeout {puts "Timeout error. Is device down or unreachable?? ssh_expect";exit} 
} 

expect { 
    -re "\[#>]$" {send "term len 0\r"} 
    timeout {puts "Error reading prompt -> $expect_out(buffer)";exit} 
} 


expect { 
    -re "\[#>]$" {send "$command\r"} 

    timeout {puts "Error reading prompt -> $expect_out(buffer)";exit} 
} 

expect -re "\[#>]$" 
set output $expect_out(buffer) 
send "exit\r" 
puts "$output\r\n" 

ध्यान दें कि मैंने दूसरे पासवर्ड के साथ संगत होने के लिए $ पासवर्ड वैरिएबल को $ पास में बदल दिया।

0

वैकल्पिक रूप से आप SSH_ASKPASS पर्यावरण चर का उपयोग कर X11 के माध्यम से पासवर्ड एकत्र कर सकते हैं।

आदमी पृष्ठ से

:

> SSH_ASKPASS 
>  If ssh needs a passphrase, it will read the passphrase from the 
>  current terminal if it was run from a terminal. If ssh does not 
>  have a terminal associated with it but DISPLAY and SSH_ASKPASS 
>  are set, it will execute the program specified by SSH_ASKPASS 
>  and open an X11 window to read the passphrase. This is particularly 
>  useful when calling ssh from a .xsession or related script. 
>  (Note that on some machines it may be necessary to redirect the 
>  input from /dev/null to make this work.) 
संबंधित मुद्दे

 संबंधित मुद्दे