发送 \003 后期望脚本停止

expect script stop after sending \003

需要有关无法继续执行的 expect 脚本的帮助。该脚本的功能是连接远程主机,更改用户然后 运行 命令。但是我放置了一个 else 语句,当更改用户提示更新密码时,它将跳过它并在下一个主机上继续。但是,脚本在我发送 \003.The 期望脚本的位置停止,如下所示;

#!/usr/bin/expect -f
set i [open "eposhosts"]
set hosts [split [read -nonewline $i] "\n"]

foreach host $hosts {
spawn /usr/bin/ssh -q appadm@$host
expect "appadm@$host:~>"
send "su epos\r"
expect "Password:"
send "password\r"
expect {
"epos@$host:/home/appadm>" {send "grep playlist /appl/epos/bin/cron.epos\r"; exp_continue}
"(current) UNIX password:" {send "[=10=]3"; exp_continue}
}
expect {
"epos@$host:/home/appadm>" {send "exit\r"; exp_continue}
"[appadm@$host ~]" {send "exit\r"}
}
expect "appadm@$host:~>"
send "exit\r"
expect eof
}

[=12=]3controlC(^C),这很可能是中断接收终端上的字符。如果 expect 按预期发送,它可以很好地停止程序。

回复@Dren 的评论: 如果您发送换行符,更改密码提示可能会拒绝(没有空密码...)并且不会停止您的脚本。

例如

{send "\n\n\n"; exp_continue}

而不是

{send "[=11=]3"; exp_continue}

从错误消息来看,问题似乎出在未转义的左方括号 [ 上。如果要匹配文字左方括号,那么应该是,

"\\[appadm@$host ~]" 

原因是,[对于TclExpect都是特殊的。除非转义,否则它将被视为命令调用。

将您的代码更改为

expect {
    "epos@$host:/home/appadm>" {send "exit\r"; exp_continue}
    "\\[appadm@$host ~]" {send "exit\r"}

}

注意:我们不需要转义右方括号。