我正在尝试动态传递密码,同时运行expect脚本。
脚本看起来有点像这样:
#!/usr/bin/Expect
set server [lindex $argv 0]
send "enter you password"
read Password;
send $password\n;
spawn ssh c1210427@$server ...
在运行脚本中从终端获取密码时卡住了。
答案 0 :(得分:1)
[read]
命令会一直读到文件末尾,所以它等着你关闭终端。改为使用[gets]
命令:
set password [gets stdin]
此外,您使用[read]
错误。第一个参数是要读取的通道ID。有关详细信息,请参阅文档:
答案 1 :(得分:1)
在您的代码中,您使用了以下代码,例如puts
语句
send "enter your password"
这不是一个正确的方法。通常,send
命令将尝试向控制台发送命令,如果通过脚本生成任何进程,则此命令将被发送到该进程。
无论如何,您将在控制台中打印语句。但是,要注意它。相反,最好使用send_user
命令。
你可以试试这个
#!/usr/bin/expect
set server [lindex $argv 0]
stty -echo; #Disable echo. To avoid the password to get printed in the terminal
send_user "enter you password : "
# Using regex to grab all the input till user press 'Enter'
# Each submatch will be saved in the the expect_out buffer with the index of 'n,string'
# for the 'n'th submatch string
# expect_out(0,string) will have the whole expect match string including the newline
# The first submatch is nothing but the whole text without newline
# which is saved in the variable 'expect_out(1,string)
expect_user -re "(.*)\n" ;
stty echo; #Enable echo
set pwd $expect_out(1,string)
send $pwd\n;
expect "some-other-statment"
#Your further code here
如果您不打扰在控制台中打印的密码,可以删除stty -echo
和stty echo