如何在管道损坏后重新连接到ssh会话?

所以我在服务器上运行apt-get upgrade时,路由器认为它已经太长了,因为它最后让我生气了:它丢弃了所有连接。 故事的道德是当你在一个流浪汉路由器上时使用很多screen

无论如何,我重新登录并在htop中发现该进程仍然悬挂在那里,仍在等待我的Y / n升级(还没有打到它,幸运的是)。 有什么方法可以重新连接到已被中断的会话吗? 我最终只是杀了它,因为它不是在包管理的中间,但知道将来参考会很好。

你正确问题的答案是: 你做不到 。 我认为主要问题是validation程序将不同步。 它只是不起作用。

正如您自己注意到的那样,解决方案是尽可能使用屏幕(顺便说一下, tmux是屏幕的替代方案)。

为了运行持久的进程,如果你想要一个更友好的界面,我使用screenbyobu

对于屏幕,您可以使用:

 screen [program] [args] 

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

要重新附加到上一个会话:

 screen -r 

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

Byobu是一个很好的改进。 它基于屏幕 ,但在底部提供了一个条形图,它将所有当前会话显示为选项卡,并提供更简单的快捷方式来移动它们。 您可以:

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

建议使用的词 :避免使用root用户打开会话。 如果任何人都可以访问您的终端(本地或远程),他们可以轻松地重新连接到正在进行的会话并以root身份使用您的系统。 如果需要,最好根据需要使用普通用户和sudo indivudual命令行启动会话。

虽然您无法重新连接到破坏的SSH会话,但您可以重新显示在其中运行的进程 – function上等同于您想要的内容。

在您的情况下,您将接管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:

 $ reptyr 10626 

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

有许多其他工具基本上与reptyr相同(即通过ptrace调试附件)。 请参阅以下问题和答案:

  • 如何拒绝正在运行的进程并将其关联到新的屏幕shell?
  • 恢复命令在已删除的SSH会话中运行

(详细信息:您不能以这种方式接管SSH会话的原因是因为sshd进程不受主机终端控制,而是提供终端的从属部分 – 一个pts设备 – 而控制它的主要部分驻留在在客户端计算机上,这里有一个破解的SSH会话。当你用reptyr -s 强制接管这样一个sshd进程时,你的键盘输入进入该进程,而不是它的活动子进程。所以“ Ctrl + Z“将简单地杀掉那个sshd 。)