当前位置:  开发笔记 > 编程语言 > 正文

如何为密码创建期望脚本提示?

如何解决《如何为密码创建期望脚本提示?》经验,为你挑选了2个好方法。

我有一个期望脚本通过ssh连接到几个路由器.所有这些路由器都有相同的密码(我知道,这是错误的),脚本需要知道密码才能连接到路由器.目前,密码作为命令行的参数传递给我的脚本,但这意味着我的.bash_history文件以及正在运行的进程中都有该密码的跟踪.因此,如果可能的话,我希望提示用户输入密码.

您是否知道是否可以提示用户输入密码?

谢谢.

编辑:如果我连接到服务器而不是路由器,我可能会使用ssh密钥而不是密码.但我使用的路由器只支持密码.



1> glenn jackma..:

使用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的期望


本书:探索Don Libes的期望
'ssty -echo'就是你输入的密码不是来自cli的回声.它正在模仿ssh w/out expect的行为.
谢谢!令人惊讶的是这种语言是多么不宽容:我写了"set pass $ expect_out(1,string)",在"string"这个词之前有一个空格,它就是炸弹.我也找不到太多文档.我希望还有一些其他解决方案.无论如何,非常感谢.

2> dr-jan..:

好的,合并上面的两个答案(或下面或现在的任何地方!):

#!/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以与其他答案保持一致.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有