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

评论

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

#1 楼

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

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

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

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

评论


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

–约翰·亨特
2012-09-19 13:38

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

– bjm88
16年1月11日在15:56



@ bjm88,仅当使用sudo启动原始屏幕会话时才应使用sudo。否则,它将返回,就像没有任何屏幕会话一样:没有要分离的屏幕

– Noam Manos
18年1月28日在9:26



+1我意识到这不是实际答案;但是,screen -r正是我想要的。

–埃里克·尼尔森(Eric Nelson)
19年7月16日在2:02

#2 楼

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

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

评论


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

–kbyrd
2009年6月4日13:20

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

– Mike Pountney
09年6月4日在13:21

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

–kbyrd
2009年6月4日13:27

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

–布伦特
2009年6月4日14:26

对我来说,屏幕工作正常,我可以重新连接到已筛选的任务并继续工作

–integratorIT
2015年5月14日晚上11:15

#3 楼

如上所述,GNU Screen是必经之路。它将允许您在远程框中具有“屏幕会话”,您可以通过多个“屏幕窗口”在其中运行多个命令。如果您的父SSH连接断开,这将简单地断开连接,并保持其中运行的所有子进程正常运行。默认情况下未安装。

基本方法是:



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

$ screen


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

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

$ screen -d -r


打开另一个屏幕“窗口”:CTRL-A,c
循环浏览打开的窗口:CTRL-A,空格

有很多很棒的地方屏幕可以做的事情。我使用它已有10多年了,仍然在寻找新功能。这是我最喜欢的Unix实用程序。

评论


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

–kbyrd
2009年6月4日13:20

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

– BarathVutukuri
18年5月11日在7:35

tmux更强大

–飞马座
19年9月6日在13:28

@BarathVutukuri,我相信您的意思是要重新启动客户端PC。很好-这就是它的目的。但这不是您运行屏幕的地方。来自serverfault.com/a/198874:“如果您登录到远程计算机,但是需要重新启动本地计算机,那么只要您在远程计算机而不是本地计算机上运行屏幕,就没有问题。 ”

– Mathieu K.
20-10-28在2:27

#4 楼

我不敢相信没有人提到过MOSH;

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


Mosh(移动外壳)

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

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会警告您-但是
连接会在网络服务恢复时恢复。打字。这可以使
糟糕的用户界面。 Mosh与众不同:它可以立即响应键入,
删除和行编辑。它具有自适应功能,甚至可以在全屏
程序(例如emacs和vim)中使用。如果连接不好,则会在突出显示的预测上加上下划线
,这样您就不会被误导。
没有特权代码。没有守护程序:
您无需成为超级用户即可安装或运行Mosh。客户端和服务器是由普通用户运行的可执行文件,并且只能在连接有效期内使用。
相同的登录方法:
Mosh不会监听网络端口或对用户进行身份验证。 Mosh客户端通过SSH登录
服务器,并且用户提供与以前相同的凭据(例如密码,公钥)。然后Mosh远程运行mosh服务器,并通过UDP连接到它。
在终端内部运行,但更好:
Mosh是一个命令行程序,如ssh。您可以在xterm,gnome-terminal,urxvt,Terminal.app,iTerm,emacs,screen或tmux中使用它。但是mosh是从头开始设计的,并且仅支持一种字符集:UTF-8。它修复了其他终端中的Unicode错误,以及SSH中的
。基于网络条件的费率。 Mosh不会填满网络缓冲区,因此Control-C
始终可以停止失控的进程。


评论


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

– jch
2015年2月6日,凌晨3:04

+1非常正确,我的错。

– jwbensley
2015年10月10日14:03



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

– Nasir Iqbal
16年2月9日在6:06

Mosh看起来很棒,尽管遗憾的是它还不支持端口转发。

– Boann
18年11月23日在13:09

#5 楼

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

评论


在可配置的保持活动之外,它本质上不允许您重新连接到会话(OP正在寻找的内容)。但是autossh对于需要ssh隧道,端口映射等的应用程序确实很有帮助。

–ives
2014年12月17日下午0:26

是的,autossh + screen是最好的选择。 autossh为此有rscreen。

– Hayalci
15年3月20日在0:16

Autossh比Mosh好。我都用过。

– Sridhar Sarnobat
17年9月15日在16:48

这是杰西·基廷(Jesse Keating)的博客文章,内容是关于在屏幕上使用autossh。

–user61015
17/12/29在23:37

#6 楼

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

就这样,您又恢复了工作。

评论


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

– CoolOppo
16年7月28日在21:09

然后屏幕好多了!

– Moshe Simantov
20 Sep 13 '20:22

#7 楼

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

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

对于初学者来说您断开连接后,可以使用

screen -ls


查看会话,并

screen -r ${session} 


重新连接到断开连接。

#8 楼

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

您可以在远程计算机上设置配置文件以自动启动和/或重新连接到登录时显示屏幕,这样一来,您会因为连接断开而忘记了一次启动屏幕的操作。

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

#9 楼

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

#10 楼

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

油灰托盘允许您执行此操作,它具有断开连接时的重新连接选项,该选项不在常规或putty-ng中。

https://puttytray.goeswhere。 com /

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

评论


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

–鹿猎人
15年1月20日在10:14

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

–munkiepus
15年1月20日在10:21



非常高兴:)

–munkiepus
15年1月20日在10:24

#11 楼

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

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

#12 楼

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

我建议您跟踪造成问题的丢失数据包的原因,并进行修复,而不是解决它。 >

评论


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

–古马
2009年6月4日13:40

它将产生很多噪音,但是您可以尝试通过strace运行ssh并查看ssh连接断开时它在做什么/报告什么。它可能只是报告您已经知道的,但谁知道...

–大卫
2009年6月4日15:42

#13 楼

还有一种选择是运行Jupyter Notebook,它具有自己的非常好的基于Web的终端模拟器。
优点

当我重新连接VPN时,我可以重新打开跨多个终端的所有连接通过打开文件夹中的所有书签在几台主机上。
我可以在任何设备上打开终端,并且在任何设备上看起来都不错。重新连接后的控制台历史记录(不是命令,只是滚动)。

如何


some_host上,运行jupyter-notebook --no-browser --port=$SOME_PORT &


通过指向some_label在浏览器中创建会话http://some_host:$SOMEPORT/terminals/some_label。您现在可以断开连接了。


将您的会话添加为书签。重新连接时,可以一次将它们全部打开。如果选项卡已经打开,则需要刷新它们。


如果$SOME_PORT上的some_host尚未打开,则使用ssh进行端口转发并连接到http://localhost:$SOME_LOCAL_PORT/terminals/some_label
 ssh -q -N -f -L localhost:$SOME_LOCAL_PORT:localhost:$SOME_PORT $some_host
 


#14 楼

我的问题很容易解决。在我的/ etc / sysconfig / network-scripts / ifcfg-eth0上,参数IPADDR设置为静态IP并且BOOTPROTO = dhcp是错误的。更新BOOTPROTO = static参数后,问题得以解决。