发送 \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=]3
是controlC(^C
),这很可能是中断接收终端上的字符。如果 expect
按预期发送,它可以很好地停止程序。
回复@Dren 的评论:
如果您发送换行符,更改密码提示可能会拒绝(没有空密码...)并且不会停止您的脚本。
例如
{send "\n\n\n"; exp_continue}
而不是
{send "[=11=]3"; exp_continue}
从错误消息来看,问题似乎出在未转义的左方括号 [
上。如果要匹配文字左方括号,那么应该是,
"\\[appadm@$host ~]"
原因是,[
对于Tcl
和Expect
都是特殊的。除非转义,否则它将被视为命令调用。
将您的代码更改为
expect {
"epos@$host:/home/appadm>" {send "exit\r"; exp_continue}
"\\[appadm@$host ~]" {send "exit\r"}
}
注意:我们不需要转义右方括号。
需要有关无法继续执行的 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=]3
是controlC(^C
),这很可能是中断接收终端上的字符。如果 expect
按预期发送,它可以很好地停止程序。
回复@Dren 的评论: 如果您发送换行符,更改密码提示可能会拒绝(没有空密码...)并且不会停止您的脚本。
例如
{send "\n\n\n"; exp_continue}
而不是
{send "[=11=]3"; exp_continue}
从错误消息来看,问题似乎出在未转义的左方括号 [
上。如果要匹配文字左方括号,那么应该是,
"\\[appadm@$host ~]"
原因是,[
对于Tcl
和Expect
都是特殊的。除非转义,否则它将被视为命令调用。
将您的代码更改为
expect {
"epos@$host:/home/appadm>" {send "exit\r"; exp_continue}
"\\[appadm@$host ~]" {send "exit\r"}
}
注意:我们不需要转义右方括号。