管道断开后如何重新连接到ssh会话?


28

因此,apt-get upgrade当路由器认为自上次发怒以来太久了时,我正在服务器上运行:它断开了所有连接。故事的寓意是,screen当您使用流浪汉路由器时,会使用很多东西。

无论如何,我重新登录并在htop中发现该进程仍然挂在那里,仍在等待我的Y / n升级(幸运的是,还没有实现)。我有什么办法可以重新加入已中断的会话?我最终只是杀死了它,因为它不在软件包管理的中间,但是很高兴知道以供将来参考。


1
我很惊讶该apt-get过程仍在运行。它应该与整个过程链一起消失,直到SSH。我注意到它会do-dist-upgrade自动在screen/ byobu会话中启动:也许在某些情况下,apt-get是否一样?
nfirvine 2012年

Answers:


16

正确问题的答案是:不能。我认为主要问题是身份验证过程将不同步。它只是不能那样工作。

如您所知,解决方案是在可能的情况下使用屏幕(顺便说一句,tmux可以替代屏幕)。


1
但是,如果您拥有无密码的ssh怎么办?那你能做到吗?
Sridhar Sarnobat

1
byobu是一个不错的,更易于使用的前端screen(或tmux)-绝对值得一看(:
drevicko

Sridhar-Samobol,仍然需要进行身份验证。附加到正在运行的会话将无法再次进行初始握手,因此如果将新会话引入现有会话中,则不变性将被破坏。答:不可以。
kevr

9

为了运行长时间的进程,如果需要更友好的界面,可以使用screenbyobu

对于屏幕,可以使用:

screen [program] [args]

这将在屏幕会话内运行[程序]及其[args] 。程序完成后,会话将自动关闭。如果您希望在程序运行后保留会话,只需在运行屏幕上不带任何参数,会话中就会出现新的提示。CTRL + A + D将终端与当前会话分离。

要重新连接到上一个会话:

screen -r

如果仅打开一个会话,它将立即重新连接。如果正在进行多个会话,它将询问您要附加到哪个会话。如果您知道会话名称,则可以将其作为参数添加到此命令行中。

Byobu是一个不错的改进。它基于屏幕,但在底部提供一个栏,将所有当前会话显示为选项卡,并提供了更方便的快捷方式来移动这些会话。您可以:

  • F2开始新的会话
  • F3移到左侧的下一个会话选项卡
  • F4移到右侧的下一个会话选项卡
  • F8给当前会话选项卡起一个友好的名字
  • F9打开选项菜单
  • CTRL + A + D从终端分离所有会话。

忠告:避免让用户root开启会话。如果任何人(本地或远程)都可以访问您的终端,则他们可以轻松地重新连接到正在进行的会话,并将您的系统用作root用户。如果需要,最好在必要时使用普通用户和sudo个性化命令行启动会话。


1
我可以引用OP:“故事的寓意是大量使用屏幕 ”。显然,这不是这里的问题。
1

感谢您的来稿,但一月份是正确的。

使用sudo screen <命令>将屏幕设置为root,需要sudo访问才能重新连接到该屏幕。比正常启动屏幕,然后在其中更改为根要好得多。
djsmiley2k-CoW

8

虽然您无法重新连接到断开的SSH会话,但是您可以重新运行SSH内部运行的进程 -功能上与您想要的相同。

使用说明

在您的情况下,您将接管apt-get要由新的 SSH会话,screen会话等控制的过程。我最喜欢的reptyr命令是:

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade

然后,使用为过程找到的pid:

$ sudo reptyr -T 10626

或者,如果这不起作用,请尝试:

$ reptyr 10626

在此阶段之后,您所有的键盘输入都将进入您接管的程序。不幸的是,您不会看到SSH会话的旧输出,例如apt-get要求您进行确认的输出。

说明

还有多种其他工具,它们的工作原理基本相同reptyr(即通过ptrace调试附件)。请参阅以下问题和答案进行讨论:

在上面的说明中,在命令使用TTY窃取的同时reptyr 10626使用ptracedebug附件,这sudo reptyr -T 10626是更可取的(详细信息)。

最后,您不能通过这种方式接管SSH会话的原因是,sshd进程不受主机终端的控制,而是提供了终端的从属部分(即pts设备),而控制它的主控部分则位于主机上。客户端计算机,在此之间有一个中断的SSH会话。当您用强制接管这样的sshd过程时reptyr -s <pid>,键盘输入将进入该过程,而不是其活动的子过程。因此,“ Ctrl + Z”将简单地杀死它sshd


1

我当时是do-dist-upgrade通过一台笔记本电脑通过ssh进行操作的,因此笔记本电脑进入了挂起状态Broken pipe。回到机器后,我看到与升级相关的过程仍在运行,其中包括whiptail询问我的信息(由显示管理器选择)以及相关的root-own SCREEN。我能够做sudo su -screen -r附加到会话和,你瞧,我在我的面前能够采取输入鞭尾对话框。我能够无缝地继续升级。

注意:这是从Ubuntu 14.04到16.04的升级。

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.