有没有办法连接到断开的 ssh 会话?我们与正在单独处理的远程站点的网络连接出现问题;但是,与此同时,在连接到远程位置的服务器时,由于丢失数据包,我们会遇到大量断开连接。很多时候会话会保持活动状态,有时它恰好处于某些操作(文件编辑、运行某些进程等)的中间,我需要返回而不是重新启动(如果可能的话)。
有没有办法连接到断开的 ssh 会话?我们与正在单独处理的远程站点的网络连接出现问题;但是,与此同时,在连接到远程位置的服务器时,由于丢失数据包,我们会遇到大量断开连接。很多时候会话会保持活动状态,有时它恰好处于某些操作(文件编辑、运行某些进程等)的中间,我需要返回而不是重新启动(如果可能的话)。
尝试将 ClientAliveInterval(例如 60)和 TCPKeepAlive(是或否)设置为服务器端 sshd.conf 上的适当值。
即使连接丢失了几分钟,这也应该使您的会话保持活动状态。
更新:有关实际答案,请参见下面 zero_r 的答案
这不是答案,而是一种解决方法。使用屏幕。
首次登录时,运行屏幕。你得到另一个shell,在其中运行命令。如果您断开连接,屏幕进程会保持终端处于活动状态,这样您的 shell 和它正在运行的进程就不会崩溃。重新连接时,运行“screen -r”以恢复。
配置和使用屏幕还有很多其他内容,但以上内容应该可以解决您的问题。
如上所述,GNU Screen是要走的路。它允许您在远程机器上进行“屏幕会话”,您可以通过多个“屏幕窗口”在其中运行多个命令。如果您的父 SSH 连接断开,这将简单地分离,保持所有子进程在其中运行并且正常运行。
man screen
screen
像往常一样是你的朋友,如果默认没有安装,应该调用OS包。基础是:
启动屏幕会话(在您的远程主机上):
断开与屏幕会话的连接:CTRL-A,d
重新登录后重新连接到您的屏幕会话:
打开另一个屏幕“窗口”:CTRL-A,c
循环浏览您打开的屏幕窗口:CTRL-A,space
你可以用屏幕做很多很酷的事情。我已经使用它超过 10 年了,我仍在寻找新功能。这是我最喜欢的 Unix 实用程序。
我不敢相信没有人提到过MOSH;
Mosh 是一个单独的协议,可以挂钩到 SSH 登录过程,它可以在断开连接、更改 IP、高延迟等几天后保持您的会话活动。它在主页上的解释比我能解释的要好,所以我复制了下面的描述。我的经验和建议是我在我的 Android 手机上使用它,它是旅行和 SSH 时的救星。例如,在火车上与手机连接时,我的笔记本电脑也是如此。我建议从源代码编译以获得最新版本,我在 Ubuntu 中的 repo 版本有一些烦恼,这些烦恼已在最新版本中修复(在撰写本文时)。
来自网站的功能:
换IP。保持连接:当您在 Internet 连接之间移动时,Mosh 会自动漫游。在火车上使用 Wi-Fi,在酒店使用以太网,在海滩上使用 LTE:您将保持登录状态。大多数网络程序在漫游后会失去连接,包括 SSH 和 Gmail 等 Web 应用程序。莫什不同。
美梦成真:使用 Mosh,您可以让您的笔记本电脑进入睡眠状态,稍后再将其唤醒,从而保持您的连接完好无损。如果您的 Internet 连接中断,Mosh 会警告您 — 但当网络服务恢复时连接会恢复。
摆脱网络延迟:SSH 在显示您自己的输入之前等待服务器的回复。这可能会导致糟糕的用户界面。Mosh 不同:它对输入、删除和行编辑提供即时响应。它可以自适应地执行此操作,甚至可以在 emacs 和 vim 等全屏程序中工作。在连接不良的情况下,突出的预测带有下划线,因此您不会被误导。
没有特权代码。无守护进程:您无需成为超级用户即可安装或运行 Mosh。客户端和服务器是由普通用户运行的可执行文件,并且仅在连接的生命周期内持续存在。
相同的登录方法:Mosh 不监听网络端口或验证用户。mosh 客户端通过 SSH 登录到服务器,用户提供与以前相同的凭据(例如,密码、公钥)。然后 Mosh 远程运行 mosh-server 并通过 UDP 连接到它。
在您的终端内运行,但更好:Mosh 是一个命令行程序,如 ssh。您可以在 xterm、gnome-terminal、urxvt、Terminal.app、iTerm、emacs、screen 或 tmux 中使用它。但是 mosh 是从头开始设计的,只支持一种字符集:UTF-8。它修复了其他终端和 SSH 中的 Unicode 错误。
Control-C 效果很好:与 SSH 不同,mosh 基于 UDP 的协议可以优雅地处理数据包丢失,并根据网络条件设置帧速率。Mosh 不会填满网络缓冲区,因此 Control-C
始终可以阻止失控的进程。
autossh 监视您的连接,如果它出现故障,它会重新连接。它比keepalives更可靠。如果您连接到屏幕会话,您将从断开连接的位置继续(请参阅
rscreen
autossh 附带的)多路复用器
这是一部经典之作。每当您冒着与终端失去连接的风险时使用它。
就这样,你又开始行动了。
我会安装并启动屏幕来解决您的问题。Screen 将让您重新连接到以前的 screen 会话。
除此之外,screen 还可以让您做一些很酷的事情,例如拆分屏幕、查看控制台等。您可以在此处和此处找到更多信息。
对于初学者,如果您断开连接,您可以使用
查看您的会话和
重新连接到断开的一个。
有时我也忘记运行屏幕并丢失未完成的工作。在这种情况下,尽管我们无法重新连接到损坏的 SSH 会话,但由于
reptyr
.意外断开 SSH 会话后,首先要运行,
screen
以免连接再次断开。然后在新会话中运行ps aux | grep {The process to be resumed}
以获取 PID。使用 PID,您可以尝试reptyr {PID}
或reptyr -T {PID}
(如果有子进程)继续工作。如果您的 ssh 会话断开,screen 将使您的 shell 会话在远程服务器上保持打开状态,但它不会对 ssh 连接断开的问题做任何事情。正如 zero_r 建议的那样,尝试使用保持活动和长时间超时来调整您的 ssh 连接。
我建议您追踪导致问题的丢失数据包的原因并修复它而不是解决它。
这个答案仍然相关, screen 存在,受支持,仍然可以完成工作等,但现在还有其他选择:tmux提供了额外的功能,并且它和 screen 都更常用(根据我的经验)包装在Byobu中。这三个都可以在主要 Linux 发行版的标准存储库中找到。
正如其他人所指出的,屏幕通常是最好的解决方案,它还添加了许多其他有用的功能。
您可以在远程计算机上设置您的配置文件以在登录时自动启动和/或重新连接到屏幕,这样您就可以避免在需要时忘记启动屏幕,因为您遭受连接中断。
请参阅http://tlug.dnho.net/?q=node/239(或在 Google 上搜索许多其他示例,它们的方式略有不同)。