![捕获来自 expect 的 bash 脚本输出,expect 挂起](https://linux22.com/image/652049/%E6%8D%95%E8%8E%B7%E6%9D%A5%E8%87%AA%20expect%20%E7%9A%84%20bash%20%E8%84%9A%E6%9C%AC%E8%BE%93%E5%87%BA%EF%BC%8Cexpect%20%E6%8C%82%E8%B5%B7.png)
我目前使用 expect 将密码传递给 rsync 来跨 unix 服务器复制文件
test.sh
./expect.sh $密码 rsync -azvr $用户名@$主机:$文件./$目录
期望文件
/usr/bin/期望-f eval spawn [lrange $argv 1 end] #期望“(是/否)?” #发送“是\r” 预期“*?密码:*” 发送 [lindex $argv 0] 发送 \r 相互影响
如果服务器密码已更改但未在脚本中更新,我希望收到通知。但是目前它会无限期挂起。如果我在 test.sh 中执行以下操作
输出 =`./expect.sh $密码 rsync -azvr $用户名@$主机:$文件./$dir`
现在脚本将无限期挂起,所以我永远没有机会处理输出。我该如何解决这个问题?
答案1
您应该编辑您的预期脚本以允许 rsync 后的超时和预期结果。
例如:
...
set timeout 60
expect "*?assword:*"
send [lindex $argv 0]
expect {
timeout { send_user "\nFatal Error: unable to rsync \n"; exit 1}
"denied" { send_user "\nFatal Error: unable to rsync \n"; exit 1}
"sent"
}
如果超过 60 秒或密码错误,收到拒绝响应,上述脚本将退出。否则,如果收到“已发送”文本,则继续。