我正在尝试创建一个脚本来运行一些需要很长时间才能执行并且需要持续连接的命令,但是
autossh user@server
wait $! #or wait ${!}
commandA
commandB
不起作用(我假设是因为autossh
它进入了后台)。 GUI 会弹出,要求输入密码,然后运行接下来的几个命令。
在运行下一个命令之前如何等待建立的连接?
更新:
autossh -f =>“...导致 autossh 在运行 ssh 之前下降到后台...”
因此,使用 -f wait 不会执行任何操作,如果没有它,您将等待 ssh,这将永远不会结束......
答案1
如果我理解正确,您的问题是您想要等到身份验证成功后再继续执行脚本的其余部分。
我会解决这个问题公钥认证和 ssh-agent。
配置完成并且 ssh-agent 运行后,ssh 将不会要求输入密码,并且您的脚本每次都会正确进行身份验证。 (这与确保连接正常工作并不完全相同,但它可能足以满足您的目的)
我想到了另外两种解决方法:
- 在 while 循环中使用 tcptraceroute 检查端口转发是否正常工作(假设您正在使用端口转发或可以为此目的创建一个端口转发)。在收到成功回复之前,不要跳出循环。
- 将长时间运行的命令放在远程端的脚本中,并在 screen 或 nohup 中执行这些命令。我过去使用过的一个技巧是生成一个脚本,然后将其复制到远程端,然后使用 nohup 执行它。