期望脚本没有发送正确的值

时间:2014-08-05 21:15:46

标签: expect

我写了一个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

1 个答案:

答案 0 :(得分:0)

首先,我要注意您不需要嵌套expect命令:请查看exp_continue命令。它只需消除重复就可以将代码大小减半。

其次,看起来你的逻辑确实是错误的。第一个期望模式是"*assword*"。当ssh的远程服务器提示输入用户的当前密码时,我希望这一点匹配,然后发送$pw1。但是,在您的代码中的其他任何位置,您似乎将$pw2视为当前密码,将$pw1视为密码。

此外,当您使用exp_continue重写代码以消除重复和嵌套时,请确保重新排序模式,以便按照最具体到最不具体的顺序列出它们。否则,您有时会发现匹配的错误模式,以及正在执行的错误代码。