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

37 ssh openssh

因此,apt-get upgrade当路由器认为自从上次让我生气以来已经太久了时,我正在服务器上运行:它断开了所有连接。这个故事的寓意是screen当你在一个流浪者路由器上时使用很多。

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

tan*_*ius 22

虽然您无法重新连接到损坏的 SSH 会话,但您可以重新设置在 SSH中运行的进程的父级- 在功能上等同于您想要的。

指示

在您的情况下,您将从新的SSH 会话、会话等中接管apt-get要控制的过程。我最喜欢的是这个命令:screenreptyr

$ sudo apt-get install reptyr
$ ps ax | grep apt-get
10626 pts/8   R+     0:32 apt-get upgrade
Run Code Online (Sandbox Code Playgroud)

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

$ sudo reptyr -T 10626
Run Code Online (Sandbox Code Playgroud)

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

$ reptyr 10626
Run Code Online (Sandbox Code Playgroud)

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

说明

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

在上面的说明中,reptyr 10626使用ptrace调试附件而sudo reptyr -T 10626命令使用 TTY 窃取并且更可取(详细信息)。

最后,你不能以这种方式接管 SSH 会话的原因是因为一个sshd进程不受主机终端控制,而是提供终端的从属部分——一个pts设备——而控制它的主部分驻留在主机上。客户端机器,这里有一个中断的 SSH 会话。当您使用 强制接管这样的sshd进程时reptyr -s <pid>,您的键盘输入将进入该进程,而不是其活动的子进程。所以一个“Ctrl+Z”只会杀死那个sshd.

  • 您能否解释一下如何使用“apt-get”安装“reptyr”以连接到仍在运行的“apt-get”进程?正在运行的进程不会锁定`dpkg`以防止安装`reptyr`吗? (3认同)

Jan*_*ary 20

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

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

  • 但是如果你有无密码的 ssh 呢?那你能做到吗? (2认同)
  • `byobu` 是一个很好的、更易于使用的前端`screen`(或`tmux`)——绝对值得一看(: (2认同)

Jul*_*oHM 11

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

对于屏幕,您可以使用:

screen [program] [args]
Run Code Online (Sandbox Code Playgroud)

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

重新附加到上一个会话:

screen -r
Run Code Online (Sandbox Code Playgroud)

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

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

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

忠告:避免使用root用户打开会话。如果有人获得对您终端的访问权限(本地或远程),他们可以轻松地重新连接到正在进行的会话并以 root 用户身份使用您的系统。如果需要,最好根据需要使用普通用户和sudo个人命令行启动会话。

  • 我可以引用OP:“这个故事的寓意是**经常使用屏幕**”。显然这不是这里的问题。 (2认同)