我通常有多个终端窗口,每个窗口都通过 ssh 连接到远程服务器。在每个窗口中,我都使用 gnu screen 程序,以确保在断开连接的情况下交互式进程的持久性。
目前,每当 ssh 连接断开时(例如当我让客户端计算机整夜进入睡眠状态时),我都必须手动且繁琐地重新启动每个窗口内的 ssh 会话,然后在每个窗口中繁琐地恢复特定的屏幕会话(例如在一个窗口中恢复“screen -r 3453”,在另一个窗口中恢复“screen -r 3462”等等)
有没有一种优雅的方法来实现这个自动化?具体来说:
一旦检测到 Internet 连接,如果 ssh 会话断开,则重新连接
ssh 重新连接后立即运行终端窗口的特定屏幕实例
感谢您提供任何有关此问题的建议
答案1
您可以运行此命令:ssh -t hostname screen -r 3453
重新连接。如果您想循环执行此操作,我会在脚本中使用以下内容。
while true; do
ssh -t -o BatchMode=yes eeepc-rsi "screen -r 3453"
sleep 2
done
如果您设置了 ssh-keys,这样无需输入密码即可登录,效果会更好。我还建议您查看 tmux,这是 screen 的更现代实现。我实际上将上述脚本与 screen 一起使用。您可能还想使用命名的 screen 会话,而不仅仅是像示例中那样使用 pid。
答案2
不需要破解 bash 循环。你需要研究一下自动SSH。我自己没有用过很多次,但我的理解是,你只需在命令中用ssh
替换即可。autossh
编辑:事实上,autossh 附带了一个名为的脚本rscreen
,该脚本似乎就是为此目的而设计的。