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

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

    更新:对于一个实际的答案见下面的zero_r的答案

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

    当你第一次login,运行屏幕。 你得到另一个shell,运行命令。 如果断开连接,屏幕进程会使terminal处于活动状态,以便您的shell及其运行的进程不会翻倒。 重新连接时,运行“screen -r”恢复。

    还有一些configuration和使用屏幕,但上述应该解决您的问题。

    尝试将ClientAliveInterval(例如60)和TCPKeepAlive(yes或no)设置为服务器端sshd.conf中的适当值。

    这应该保持您的会话活着,即使连接丢失了几分钟。

    如上所述, GNU屏幕是要走的路。 它将允许你在远程盒上有一个“屏幕会话”,你可以通过多个“屏幕窗口”运行多个命令。 如果您的父母SSH连接死亡,这将简单地分离,保持所有子stream程在其中运行。

    ' man screen '和往常一样是你的朋友,如果没有默认安装,OS包应该叫' screen '。

    基础是:

    • 开始一个屏幕会话(在您的远程主机上):

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

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

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

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

    屏幕上有很多很酷的东西。 我已经使用了10多年了,现在还在发现新function。 这是我最喜欢的Unix工具。

    我不敢相信没有人提到MOSH ,

    Mosh是一个独立的协议,可以挂钩到SSHlogin过程中,它可以让你的会话在断开连接之后保持活着状态,改变IP,高延迟等等。 它在主页上的解释比我可以解释,所以我已经复制下面的描述。 我的经验和build议是,我在Android手机上使用它,这是旅行和SSH'ing时节省生命。 例如,当我的笔记本电脑与列车上的移动电话连接时,情况也是如此。 我build议从源代码编译得到最新版本,Ubuntu里面的repo版本有一些烦人的地方,在最新版本(写作的时候)是固定的。

    Mosh(手机壳)

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

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

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

    网站的function:

    • 更改IP。 保持联系 :当您在互联网连接之间移动时,Mosh会自动漫游。 在火车上使用Wi-Fi,在酒店使用以太网,在沙滩上使用LTE:您将保持login状态。大多数networking程序在漫游后都会丢失连接,包括SSH和Web应用程序(如Gmail)。 Mosh是不同的。

    • 为了美梦 :随着Mosh,你可以把你的笔记本电脑睡觉,稍后唤醒,保持你的连接完好无损。 如果您的互联网连接断开,Mosh会警告您 – 但在networking服务恢复时,连接将恢复。

    • 摆脱networking滞后 :在等待服务器回复之前,SSH显示你自己的input。 这可能会导致糟糕的用户界面。 Mosh不同:它可以立即响应打字,删除和行编辑。 它可以自适应地运行,甚至可以在emacs和vim等全屏程序中运行。 在一个不好的联系上,突出的预测是强调的,所以你不会被误导。

    • 没有特权的代码。 没有守护进程 :你不需要成为超级用户来安装或运行Mosh。 客户端和服务器是由普通用户运行的可执行文件,并且仅在连接的生命周期中持续。

    • 同样的login方法 :Mosh不会侦听networking端口或validation用户。 mosh客户端通过SSHlogin到服务器,并且用户像以前一样呈现相同的凭证(例如密码,公钥)。 然后Mosh远程运行mosh-server并通过UDP连接到它。

    • 在你的terminal内运行,但更好 :Mosh是一个命令行程序,像ssh。 你可以在xterm,gnome-terminal,urxvt,Terminal.app,iTerm,emacs,screen或者tmux中使用它。 但是mosh是从零开始devise的,只支持一个字符集:UTF-8。 它修复了其他terminal和SSH中的Unicode错误。

    • Control-C很好用 :与SSH不同,mosh的基于UDP的协议可以很好地处理丢包,并根据networking条件设置帧速率。 Mosh不填满networking缓冲区,所以Control-C
      总是努力阻止失控的过程。

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

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

    除此之外,屏幕也让你做很酷的事情,如拆分屏幕,查看控制台等。您可以在这里和这里find更多的信息。

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

     screen -ls 

    查看您的会话和

     screen -r ${session} 

    重新连接到一个断开连接。

    TMUX

    这是一个经典的。 每当你冒着失去连接terminal的风险时使用它。

     $ 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 

    就这样,你又回来了

    正如其他人所指出的,屏幕通常是最好的解决scheme,它也增加了许多其他有用的function。

    您可以在远程机器上设置您的configuration文件,以便在login时自动启动和/或重新连接到屏幕上,这样可以避免因为连接断开而忘记一次启动屏幕。

    请参阅http://tlug.dnho.net/?q=node/239 (或者以不同的方式在Google上search许多其他示例)。

    一个更现代的屏幕替代,唉一些types的“虚拟化”不可用(例如在cygwin你可以有“屏幕”,但不是因为它的devise方式“tmux”),但无论你有select安装tmux ,我强烈build议去那个屏幕。

    这是另一个非屏幕解决scheme。

    油灰托盘允许你做到这一点,它有一个断开的重新连接选项,不正常或腻子

    https://puttytray.goeswhere.com/

    这是一个腻子与其他选项叉,去连接设置,有2个选项,一个“试图重新连接失败”,并试图重新启动连接。

    虽然屏幕会保持你的shell会话在远程服务器上打开,如果你的SSH会话下降,它不会做任何关于ssh连接被丢弃的问题。 正如zero_rbuild议的,尝试调整你的SSH连接,保持活力和超时。

    我build议你找出导致问题的丢失数据包的原因,并解决它,而不是解决它。