期待脚本在发送\ 003后停止

时间:2015-11-19 00:50:58

标签: shell expect

在期望脚本上需要一些帮助才能继续。脚本的功能是在远程主机上连接,更改用户然后运行命令。但是我发出了一个else声明,当更改用户提示更新密码时,它将跳过它并继续在下一个主机上。但是脚本在我发送\ 003的位置停止。期望脚本如下所示;

#!/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 "\003"; 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
}

2 个答案:

答案 0 :(得分:4)

从错误消息中看,问题是因为未转义的空方括号[。如果你想匹配文字的开放方括号,那么它应该是,

"\\\[appadm@$host ~]" 

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

将您的代码更改为,

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

}

注意:我们不需要越过方括号。

答案 1 :(得分:2)

\003 control C ^C),它可能是接收终端上的中断字符。如果expect按预期发送,则可以很好地停止程序。

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

例如

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

而不是

{send "\003"; exp_continue}