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


156

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


10
我不敢相信没有人提到mosh.mit.edu
jwbensley 2013年

@javano:我从未听说过。添加它作为答案!
kbyrd

@kbyrd完成了;)
jwbensley

unix.stackexchange.com/questions/105001/…中提出了类似的问题,并提出了一些有关如何首先解决断开连接的提示……
anarcat

Answers:


135

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

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

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

还有很多配置和使用屏幕的方法,但是以上方法可以解决您的问题。


18
或使用tmux-一个“凉爽”的屏幕,我既使用过又使用tmux,因为您可以很好地拆分该术语。
约翰·亨特2012年

3
我很高兴发现screen我的Ubuntu 12.x已经安装了该命令,因此,如果您不确定只是尝试使用此命令,它将重新连接并恢复do-release-upgrade过程:sudo screen -D -r
bjm88 '16

1
@ bjm88,sudo仅当原始屏幕会话是使用sudo启动时才应使用。否则,它将返回,就好像没有任何屏幕会话一样:There is no screen to be detached
Noam Manos

+1我意识到这不是实际答案;但是,screen -r正是我想要的。
埃里克·纳尔逊

129

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

即使连接断开了几分钟,这也应该使会话保持活动状态。


24
到目前为止,您似乎是唯一实际回答该问题的人,而不是建议使用屏幕作为解决方法。
kbyrd

2
好决定。我们发现,这种方法在遍历cisco ASA / PIX防火墙时特别有用,默认情况下,该方法会使TCP连接超时。
Mike Pountney 2009年

5
也许这不是问的正确地方,但发帖人是否可以切换答案?我们应该在“屏幕”答案(我的不是最好的答案,我喜欢Mike Pountney的答案,但我得到了代表)中包含此信息。
kbyrd

1
通过Cisco VPN连接进行连接并且VPN连接丢失并重新建立后,此功能是否可以工作?
布伦特

对我来说,屏幕运行非常完美,我可以重新连接到经过筛选的任务,并工作正常
integratorIT

64

如上所述,GNU Screen是必经之路。它将允许您在远程框中进行“屏幕会话”,您可以通过多个“屏幕窗口”在其中运行多个命令。如果您的父SSH连接断开,这将简单地断开,使其中运行的所有子进程保持良好状态。

man screen”和往常一样是您的朋友,screen如果默认情况下未安装OS软件包,则应将其称为“ ”。

基础是:

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

    $ screen
    
  • 断开与屏幕会话的连接:CTRL-Ad

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

    $ screen -d -r
    
  • 打开另一个屏幕“窗口”: CTRL-Ac

  • 通过您打开纱窗周期:CTRL-Aspace

Screen 有很多很酷的功能。我使用它已有10多年了,但仍在寻找新功能。这是我最喜欢的Unix实用程序。


1
是的,这是比我更好的答案。
kbyrd

如果我在运行屏幕的计算机上重新启动计算机,是否仍可以连接到断开的ssh会话?
BarathVutukuri

tmux更强大
飞马

46

我不敢相信没有人提到MOSH

Mosh是一个单独的协议,可以连接到SSH登录过程,在断开连接,更改IP,高延迟等天后,它可使会话保持活动状态。在主页上对它的解释比我能解释的要好,因此,我复制了下面的描述。我的经验和建议是,我可以在Android手机上使用它,在旅行和SSH's时可以节省生命。例如,在火车上将手机与手机捆绑在一起时,在笔记本电脑上也是如此。我建议从源代码进行编译以获取最新版本,Ubuntu内部的repo版本在其中存在一些烦人之处,这些烦恼已在最新版本中得到解决(在撰写本文时)。

莫什(手机壳)

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

Mosh替代了SSH。它更加健壮和响应迅速,尤其是在Wi-Fi,蜂窝和长途链路上。

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

网站功能:

  • 更改IP。保持连接状态:当您在Internet连接之间移动时,Mosh会自动漫游。在火车上使用Wi-Fi,在酒店使用以太网,在海滩上使用LTE:您将保持登录状态。漫游后,大多数网络程序都会失去连接,包括SSH和Web应用程序(例如Gmail)。莫什与众不同。

  • 美梦成真:借助Mosh,您可以让笔记本电脑进入睡眠状态,然后将其唤醒,以保持连接状态不变。如果您的Internet连接断开,Mosh会警告您-但是当网络服务恢复时,连接会恢复。

  • 摆脱网络延迟:SSH等待服务器的答复,然后显示您自己的键入内容。这可能会导致糟糕的用户界面。Mosh与众不同:它可以立即响应键入,删除和行编辑。它可以自适应地做到这一点,甚至可以在全屏程序(例如emacs和vim)中使用。如果连接不好,则会突出显示出色的预测,因此您不会被误导。

  • 没有特权代码。No daemon:您无需成为超级用户即可安装或运行Mosh。客户端和服务器是由普通用户运行的可执行文件,仅在连接有效期内有效。

  • 相同的登录方法:Mosh不会监听网络端口或验证用户身份。Mosh客户端通过SSH登录到服务器,并且用户提供与以前相同的凭据(例如,密码,公钥)。然后,Mosh远程运行mosh服务器,并通过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
    始终可以终止失控的进程。


8
Mosh不是ssh包装器,它是一种不同的协议,几乎与ssh无关(它仅使用ssh进行登录)。
jch 2015年

+1非常正确,我的错。
jwbensley,2015年

2
安全性如何,中间人?加密?密钥交换?
Nasir Iqbal

MOSH看起来真棒,但遗憾的是不支持端口转发还没有
Boann

20

autossh监视您的连接,如果连接断开,它将重新连接。它比keepalive更可靠。如果您连接到屏幕会话,则将从断开的位置继续(请参见rscreenautossh附带的内容)


1
在可配置的保持活动之外,它本质上不允许您重新连接到会话(OP正在寻找的内容)。但autossh可真是利于需要使用SSH隧道,端口映射等应用程序
艾夫斯

是的,autossh + screen是最好的选择。autossh rscreen为此。
hayalci 2015年

Autossh比mosh好。我都用过。
Sridhar Sarnobat

这是杰西·基廷(Jesse Keating)的博客文章,内容涉及将autossh与screen结合使用
sampablokuper

12

多路复用器

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

$ 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

就像那样,您又回来了。


万分感谢!我一直在寻找如何使用tmux进行此操作,因为这似乎是大多数人认为更好的选择。
CoolOppo

10

我将安装并启动屏幕来解决您的问题。屏幕将使您重新连接到上一个屏幕会话。

除此之外,屏幕还使您可以做一些很酷的事情,例如拆分屏幕,查看控制台等。您可以在此处此处找到更多信息。

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

screen -ls

查看您的会话和

screen -r ${session} 

重新连接到断开连接的服务器。


4

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

您可以在远程计算机上将您的配置文件设置为在登录时自动启动和/或重新连接到屏幕,这样可以避免由于连接断开而忘记了在需要时一次启动屏幕的情况。

参见http://tlug.dnho.net/?q=node/239(或在Google上搜索许多其他示例,它们的方式稍有不同)。


3

屏幕的一种更现代的替代方法,遗憾的是某些类型的“虚拟化”不可用(例如,在cygwin中,由于其设计方式,您可以安装“屏幕”,但不能安装“ tmux”),但是无论您选择安装tmux ,我强烈建议您去安装那一块屏幕。


3

这是另一个非屏幕解决方案。

腻子托盘允许您执行此操作,它具有“断开连接时重新连接”选项,该选项不是常规的或腻子

https://puttytray.goeswhere.com/

它是腻子的一个(完全开源的)叉子,带有其他选项,进入连接设置,并且有2个选项,一个用于“尝试在连接失败时重新连接”和“尝试在启动时重新连接”。


1
恩 它是否带有键盘记录程序和自动的ppk渗透实用程序?
Deer Hunter

1
我假设您是在问它是否以某种方式窃取了您的详细信息,它是完全开源的,如果您想查看它的github.com/FauxFaux/PuTTYTray,那么源代码可以在github上找到,有很多贡献者: )
munkiepus 2015年

非常
高兴

2

如果ssh会话断开,屏幕将使您的Shell会话在远程服务器上保持打开状态,但它对于ssh连接断开的问题没有任何帮助。正如zero_r所建议的那样,请尝试通过保持活动和长时间超时来调整ssh连接。

我建议您跟踪导致问题的数据包丢失的原因,并解决该问题,而不要解决它。


谢谢你的建议。我们正在研究丢包的根本问题,只是花了一段时间才能弄清楚(这个问题非常棘手!)。这确实是此麻烦时期的一种解决方法。人们永远不知道什么时候会导致连接断开。
古马

1
它将产生很多噪音,但是您可以尝试通过strace运行ssh并查看它在ssh连接断开时的状态/报告。它可能只是报告您已经知道的内容,但谁知道呢……
David

1

有时我也忘记运行屏幕并丢失未完成的工作。在这种情况下,尽管我们无法重新连接到断开的SSH会话,但是由于,仍然可以将正在运行的程序重新绑定到新的终端并恢复您的工作reptyr

意外断开与SSH会话的连接后,首先要做的是screen避免连接再次断开。然后在新会话中,运行ps aux | grep {The process to be resumed}以获取PID。使用PID,您可以尝试reptyr {PID}reptyr -T {PID}(如果有子流程)继续工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.