我写了一个expect脚本,它将连接到服务器并根据提示发送密码。目的是在新服务器上更新我的密码。
基本上,它将连接到新服务器,期望看到(current) UNIX password:
然后发送我的初始密码。然后它会看到“新密码:and 'Retype new password:
每次都会提示发送新密码。
我的脚本将这些密码从文件加载到变量$pw1
和$pw2
中。我已对它们进行了评估,并验证我已将正确的值加载到变量中。但是,当我运行脚本时,我在初始密码上得到token manipulation error
,告诉我发送的值不正确。
也许我的逻辑不正确?
编辑:我已连接到我正在运行脚本的一台服务器,并输入旧密码,就像脚本加载到$pw2
的文件一样。它正在工作,所以我知道密码不正确。
#! /usr/bin/expect --
#exp_internal 1
#set stty_init raw
set timeout 45
set prompt {\$ $}
set file1 [open [lindex $argv 0] r]
set pw1 [exec cat /home/user/bin/.pw1.txt]
set pw2 [exec cat /home/user/bin/.pw2.txt]
#puts $pw1
#puts $pw2
while {[gets $file1 host] != -1} {
puts $host
spawn -noecho ssh -q $host
expect {
"*assword*" {
send -- "$pw1\r"
expect {
$prompt {
send -- exit\r
}
}
send -- exit\r
expect eof
}
-re $prompt {
send -- exit\r
expect eof
}
"(current)*" {
send -- "$pw2\r"
expect "New password"
send -- "$pw1\r"
expect "Retype new password"
send -- "$pw1\r"
puts \r
}
"continue*" {
send "yes\r"
expect {
"current" {
send -- "$pw2\r"
expect "New password"
send -- "$pw1\r"
expect "Retype new password"
send -- "$pw1\r"
puts \r
# expect eof
}
-re $prompt {
send -- exit\r
expect eof
}
}
}
}
}
puts \r
答案 0 :(得分:0)
首先,我要注意您不需要嵌套expect
命令:请查看exp_continue
命令。它只需消除重复就可以将代码大小减半。
其次,看起来你的逻辑确实是错误的。第一个期望模式是"*assword*"
。当ssh
的远程服务器提示输入用户的当前密码时,我希望这一点匹配,然后发送$pw1
。但是,在您的代码中的其他任何位置,您似乎将$pw2
视为当前密码,将$pw1
视为新密码。
此外,当您使用exp_continue
重写代码以消除重复和嵌套时,请确保重新排序模式,以便按照最具体到最不具体的顺序列出它们。否则,您有时会发现匹配的错误模式,以及正在执行的错误代码。