我有一个期望脚本通过ssh连接到几个路由器.所有这些路由器都有相同的密码(我知道,这是错误的),脚本需要知道密码才能连接到路由器.目前,密码作为命令行的参数传递给我的脚本,但这意味着我的.bash_history文件以及正在运行的进程中都有该密码的跟踪.因此,如果可能的话,我希望提示用户输入密码.
您是否知道是否可以提示用户输入密码?
谢谢.
编辑:如果我连接到服务器而不是路由器,我可能会使用ssh密钥而不是密码.但我使用的路由器只支持密码.
使用expect的stty
命令如下:
# grab the password stty -echo send_user -- "Password for $user@$host: " expect_user -re "(.*)\n" send_user "\n" stty echo set pass $expect_out(1,string) #... later send -- "$pass\r"
请注意,在致电stty -echo
之前打电话send_user
很重要- 我不确定原因:我认为这是一个时间问题.
期望程序员都应该阅读这本书:探索Don Libes的期望
好的,合并上面的两个答案(或下面或现在的任何地方!):
#!/usr/bin/expect log_user 0 set timeout 10 set userid "XXXXX" set pass "XXXXXX" ### Get two arguments - (1) Host (2) Command to be executed set host [lindex $argv 0] set command [lindex $argv 1] # grab the password stty -echo send_user -- "Password for $userid@$host: " expect_user -re "(.*)\n" send_user "\n" stty echo set pass $expect_out(1,string) spawn /usr/bin/ssh -l $userid $host 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 host 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"
请注意,我将$ password变量更改为$ pass以与其他答案保持一致.