题 如何重新连接到断开连接的ssh会话


有没有办法连接到断开连接的ssh会话?我们与我们正在单独处理的远程站点的网络连接存在问题;然而,与此同时,我们在连接到远程位置的服务器时因丢失数据包而遇到大量断开连接。很多时候会话保持活动状态一段时间,有时它恰好处于某个操作(文件编辑,运行某些进程等等)的中间,我需要回到它而不是重新启动(如果可能的话)。


141
2018-06-04 13:04




我无法相信没人提到过 mosh.mit.edu - jwbensley
@javano:我从来没有听说过。添加它作为答案! - kbyrd
@kbyrd已经完成;) - jwbensley
问了一个类似的问题 unix.stackexchange.com/questions/105001/... 关于如何解决断线问题的一些提示...... - anarcat


答案:


更新:有关实际答案,请参阅下面的zero_r答案

这不是答案,而是一种解决方法。使用 屏幕

首次登录时,运行屏幕。你得到另一个shell,运行命令。如果您断开连接,屏幕进程会使终端保持活动状态,以便您的shell及其运行的进程不会崩溃。重新连接时,运行'screen -r'继续。

配置和使用屏幕还有很多,但上面的内容应该可以解决您的问题。


126
2018-06-04 13:08



或者使用tmux - 一个'冷却器'屏幕,我使用过两者并且更喜欢tmux,因为你可以很好地分割这个术语。 - John Hunt
我很高兴找到 screen 已经安装在我的Ubuntu 12.x上,所以如果你不确定只是尝试这个命令,它确实重新连接并恢复了 做释放升级 进程:sudo screen -D -r - bjm88
@ bjm88, sudo 只有在使用sudo启动原始屏幕会话时才应使用。否则它将返回,就好像没有屏幕会话存在: There is no screen to be detached - Noam Manos


尝试将clientAliveInterval(例如60)和TCPKeepAlive(是或否)设置为服务器端sshd.conf上的适当值。

即使连接丢失几分钟,这也应该使您的会话保持活动状态。


118
2018-06-04 13:08



到目前为止,您似乎是唯一一个实际回答问题的人,而不是建议屏幕作为解决方法。 - kbyrd
好决定。我们发现这种方法在遍历cisco ASA / PIX防火墙时特别有用,它们默认情况下喜欢超时tcp连接。 - Mike Pountney
也许这不是一个正确的问题,但是海报可以切换答案吗?我们应该通过这些信息“筛选”答案(我的不是最好的,我喜欢Mike Pountney,但我得到了代表)。 - kbyrd
通过Cisco VPN连接连接时,这是否有效,VPN连接是否丢失并重新建立? - Brent
对我而言,屏幕工作非常完美,我可以重新连接到屏幕上的任务和countiune工作 - integratorIT


正如刚才提到的, GNU屏幕 是要走的路。它允许您在远程盒子上进行“屏幕会话”,您可以通过多个“屏幕窗口”运行多个命令。如果您的父SSH连接断开,这将简单地分离,保持所有子进程在其中运行并且运行良好。

man screen'像往常一样是你的朋友,应该调用操作系统包'screen'如果没有默认安装。

基础知识是:

  • 启动屏幕会话(在远程主机上):

    $ screen
    
  • 断开屏幕会话: CTRL-Ad

  • 重新登录后重新连接到您的屏幕会话:

    $ screen -d -r
    
  • 打开另一个屏幕'窗口': CTRL-AC

  • 循环打开屏幕窗口: CTRL-A空间

地段 你可以用Screen做的很酷的东西。我已经使用它超过10年了,仍然在寻找新的功能。这是我最喜欢的Unix实用程序。


59
2018-06-04 13:19



是的,这是一个比我更好的答案。 - kbyrd
如果我重新启动运行屏幕的电脑,我还可以连接到断开连接的ssh会话吗? - BarathVutukuri


我无法相信没人提到过 MOSH;

Mosh是一个独立的协议,可以挂钩到SSH登录过程,它可以在断开连接数天,改变IP,高延迟等等之后使会话保持活动状态。在主页上解释的比我解释的要好,所以我复制了下面的描述。我的经验和建议是我在我的Android手机上使用它,它在旅行和SSH时节省了大量时间。例如,当我在火车上系上移动电话时,我的笔记本电脑也是如此。我建议从源代码编译以获取最新版本,Ubuntu内部的repo版本在其中有一些烦恼,这些烦恼已在最新版本中修复(在撰写本文时)。

莫什(手机壳)

允许漫游的远程终端应用程序,支持间歇性   连接,并提供智能本地回声和行编辑   用户击键。

Mosh是SSH的替代品。它更强大,反应灵敏,   特别是通过Wi-Fi,蜂窝和长途链接。

Mosh是免费软件,可用于GNU / Linux,FreeBSD,Solaris,Mac   OS X和Android。

网站功能:

  • 改变IP。保持联系: 当你移动时,Mosh会自动漫游 互联网连接之间。在火车上使用Wi-Fi,在以太网中使用 酒店和海滩上的LTE:你会保持登录状态。大多数网络 程序在漫游后失去连接,包括SSH和Web Gmail等应用。莫什与众不同。

  • 为了甜蜜的梦想: 有了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。它修复了其他终端中的Unicode错误 在SSH中。

  • Control-C效果很好: 与SSH不同,mosh基于UDP的协议可以优雅地处理丢包,并设置帧 基于网络条件的费率。 Mosh没有填满网络缓冲区,所以Control-C
    总是努力制止一个失控的过程。


41
2017-11-24 13:01



Mosh不是一个ssh包装器 - 它是一个不同的协议,几乎完全与ssh无关(它只使用ssh进行登录)。 - jch
+1非常正确,我的错误。 - jwbensley
安全怎么样,中间人呢?加密?密钥交换? - Nasir Iqbal


autossh 监视您的连接,如果它关闭,它会重新连接。它比Keepalive更可靠。如果您连接到屏幕会话,您将从断开连接处继续(请参阅 rscreen autossh附带)


19
2018-06-06 09:11



在可配置的保持活动之外,它本身并不允许您重新连接到会话(OP正在寻找的内容)。但autossh对于需要ssh隧道,端口映射等的应用程序非常有用。 - ives
是autossh +屏幕将是最佳选择。 autossh有 rscreen为了这。 - hayalci
Autossh比mosh好。我用过这两个。 - Sridhar-Sarnobat
这是Jesse Keating关于使用的博客文章 带屏幕的autossh。 - sampablokuper


我安装并启动屏幕来解决您的问题。屏幕将允许您重新连接到以前的屏幕会话。

除此之外,屏幕还让你做一些很酷的事情,比如拆分屏幕,查看控制台等等。你可以找到更多信息 这里 和 这里

对于初学者,如果断开连接,则可以使用

screen -ls

查看您的会话和

screen -r ${session} 

重新连接到断开的连接。


9
2018-06-04 13:06





TMUX

这是一个经典。每当您冒着失去与终端的连接的风险时使用它。

$ tmux
$ sh do_something_that_takes_forever

!! Connection fails so you reconnect once you notice

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0

就这样,你又回来了。


9
2018-04-06 01:24



万分感谢!我一直在寻找如何用tmux做到这一点,因为这似乎是大多数人认为更好的选择。 - CoolOppo


正如其他人所指出的,屏幕通常是最好的解决方案,它还增加了许多其他有用的功能。

您可以在远程计算机上设置您的配置文件,以便在登录时自动启动和/或重新连接到屏幕,这样可以避免因为连接丢失而忘记一次启动屏幕。

看到 http://tlug.dnho.net/?q=node/239 (或搜索谷歌的许多其他例子略有不同的方式)。


3
2018-06-04 13:47



该链接中的好脚本,谢谢! - palehorse