捕获来自 expect 的 bash 脚本输出,expect 挂起

捕获来自 expect 的 bash 脚本输出,expect 挂起

我目前使用 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 秒或密码错误,收到拒绝响应,上述脚本将退出。否则,如果收到“已发送”文本,则继续。

相关内容