我正在尝试编写expect
脚本来启动SSH隧道,等待隧道进程关闭(抛出错误),然后重新运行隧道命令。 (值得注意的是autossh
和其他自动隧道解决方案在这里并不相关,因为我正在尝试做的事情涉及expect
。)这是包含故障排除消息的完整脚本。
#!/usr/bin/expect
set timeout 1
while { $timeout == 1 } {
spawn -noecho ssh -f -N -T -R22224:localhost:22223 username@xxx.xxx.xxx.xxx
send_user "Looking for host"
set timeout 0
wait
set timeout 1
send_user "We've encountered an error. Re-running."
}
send_user "Out of the loop."
ssh
命令有效,而expect
man page表示wait
应保留脚本,直到当前生成的进程终止,但它没有,它最终重新运行循环a一大堆时间(迫使我在远程机器上pkill
多个sshd
个实例。我已经尝试了wait spawn
,wait spawn_id
,expect {ssh*}
(根据手册页,也应该让脚本等待),但没有任何东西会让脚本暂停。
答案 0 :(得分:1)
ssh -f
将分叉子进程(在后台运行),父进程只是退出。 Expect的wait
命令只等待spawn
父进程,因此wait
很快就会返回。