我正在从unix服务器执行以下行:
expect -c 'spawn ssh otherHost chown -R user:group /usr ; expect password: ; send 123456\n ; interact ;'
我得到返回值0,一个空的stderr和一个标有/usr/... Not owner, /usr/... Not Owner ..
的标准输出。
如果我单独执行命令行ssh otherHost chown -R user:group /usr
,则会以适当的方式返回此消息,并返回值!= 0以及错误流中的错误消息。
我需要以编程方式知道是否有错误,并且期望(我需要避免传递密码)不允许我。 (一个好主意是使用expect创建sshkeys,然后正常ssh到服务器 - 但我需要服务器在它们之间有密码。)
无论如何,如何在使用expect时发现错误?
答案 0 :(得分:0)
我习惯在脚本中编写所有Expect内容。这有助于调试并增加可读性。
在Expect中,您始终可以为每个期望处理异常添加“超时”。当期望模式不匹配时,您可以发送一些消息来通知情况。以ssh为例:
spawn ssh user@192.168.1.1
expect {
"Password:" {send "user123\n"; exp_continue}
timeout {send_user "connection fail\n"; exit}
-ex "$"
}
如果没有匹配的模式,Expect将运行timeout
块并显示“连接失败”。
如果我是你,我会将复杂的ssh命令拆分成许多简单的命令。即首先ssh到服务器,处理登录过程,然后做chown的东西。该脚本如下所示:
# login
spawn ssh user@192.168.1.1
expect {
-ex "(yes/no)?" {send "yes\n"; exp_continue}
"Password:" {send "user123\n"; exp_continue}
timeout {send_user "connection fail\n"; exit}
-ex "#"
}
# do chown
send "chown -R user /usr\n"
expect {
"No such file or directory" {send_user "No such file or directory\n"; exp_continue}
"Operation not permitted" {send_user "Operation not permitted\n"; exp_continue}
"invalid user" {send_user "Invalid user name\n"; exp_continue}
-ex "$"
}
请记住,在大多数情况下,Expect对命令是否成功一无所知。脚本必须通过期望输出字符串并处理每种情况来检查自己。
对于你的情况,我认为有一种简单的方法可以通过$的值检查命令?如果你将原始命令分成小块。
# after ssh login, do chown
send "chown -R user /usr\n"
expect -ex "$"
send "echo rv: $?\n"
expect {
"rv: 0" {send_user "command successed\n"}
timeout {send_user "command failed: $expect_out(buffer)\n"; exit}
}
希望这有帮助。