有没有办法连接到已断开连接的 ssh 会话?我们在与远程站点的网络连接方面遇到了问题,我们正在单独处理该问题;但是,与此同时,由于连接到远程位置的服务器时丢失了数据包,我们遇到了大量断开连接的情况。很多时候,会话会保持活动状态一段时间,有时它恰好处于某些操作(文件编辑、运行某些进程等)的中间,我需要返回而不是重新启动(如果可能的话)。
答案1
更新:有关实际答案,请参见下面 zero_r 的答案
这不是一个答案,而是一个解决方法。使用屏幕。
首次登录时,运行 screen。您将获得另一个 shell,并在其中运行命令。如果您断开连接,screen 进程将保持终端处于活动状态,以便您的 shell 及其运行的进程不会崩溃。重新连接时,运行“screen -r”以恢复。
配置和使用屏幕还有很多事情要做,但是以上内容应该可以解决您的问题。
答案2
尝试在服务器端 sshd.conf 上将 ClientAliveInterval (例如 60)和 TCPKeepAlive (是或否)设置为适当的值。
即使连接丢失几分钟,您的会话也能保持活动状态。
答案3
正如刚才提到的,GNU 屏幕是可行的方法。它允许您在远程框上进行“屏幕会话”,您可以通过多个“屏幕窗口”在其中运行多个命令。如果您的父 SSH 连接断开,这将简单地分离,从而使其中运行的所有子进程保持活跃和良好。
man screen
screen
像往常一样是你的朋友,如果默认没有安装,则应该调用OS包。
基本内容如下:
启动屏幕会话(在远程主机上):
$ screen
断开与屏幕会话的连接:CTRL-A,d
再次登录后重新连接到您的屏幕会话:
$ screen -d -r
打开另一个屏幕‘窗口’:CTRL-A,c
循环浏览打开的屏幕窗口:CTRL-A,space
有很多您可以使用 screen 做很多很酷的事情。我已经用它 10 多年了,但我仍在寻找新功能。它是我最喜欢的 Unix 实用程序。
答案4
有时我也会忘记运行 screen,从而丢失未完成的工作。在这种情况下,虽然我们无法重新连接到中断的 SSH 会话,但由于 ,仍然可以将正在运行的程序重新定位到新终端并恢复您正在做的事情reptyr
。
意外断开 SSH 会话后,首先要做的是运行screen
(或 tmux,随你喜欢),以免连接再次中断。然后在新会话中运行ps aux | grep {The process to be resumed}
以获取 PID。有了 PID,您可以尝试reptyr {PID}
或reptyr -T {PID}
(如果有子进程)继续工作。
补充笔记:
另外,请考虑在服务器端 sshd.conf 上将 ClientAliveInterval(例如 60)和 TCPKeepAlive(是或否)设置为适当的值正如 zero_r 的回答中提到的或者,如果你必须在像 Starlink 风暴中那样数据包丢失率极高的网络环境中工作,切换到 MOSH,一种基于 UDP 的 SSH 替代品。