it-swarm.cn

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

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

164
palehorse

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

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

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

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

142
kbyrd

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

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

134
zero_r

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

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

基础是:

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

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

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

    $ screen -d -r
    
  • 打开另一个窗口“窗口”: CTRL-A, c

  • 循环打开屏幕窗口: CTRL-A, space

有 很多 Screen可以完成的许多有趣的工作。我使用它已有10多年了,但仍在寻找新功能。这是我最喜欢的Unix实用程序。

64
Mike Pountney

我不敢相信没有人提到 [〜#〜] mosh [〜#〜] ;

Mosh是一个单独的协议,可以连接到SSH登录过程,在断开连接,更改IP,高延迟等天后,它可使会话保持活动状态。在主页上对它的解释比我能解释的要好,因此,我复制了以下描述。我的经验和建议是,我可以在自己的Android移动设备上使用它,这是旅行和SSH时的救生器。例如,在火车上与移动设备捆绑在一起时,在笔记本电脑上也是如此我建议从源代码进行编译以获取最新版本,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则不同。

  • 做个美梦:使用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
    总是可以阻止失控的过程。

47
jwbensley

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

20
hayalci

多路复用器

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

$ 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

就像那样,您又回来了。

14
Jacksonkr

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

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

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

screen -ls

查看您的会话和

screen -r ${session} 

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

10
wzzrd

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

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

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

4
David Spillett

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

PuTTY托盘可让您做到这一点,它具有“断开连接时重新连接”选项,这不是常规的或PuTTY-ng

https://puttytray.goeswhere.com/

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

3
munkiepus

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

3
cepal

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

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

2
David

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

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

2
march_happy