【问题标题】:How to reconnect to accidentally disconnected ssh session WITHOUT screen or tmux如何在没有屏幕或 tmux 的情况下重新连接到意外断开的 ssh 会话
【发布时间】:2013-12-06 19:19:14
【问题描述】:

我知道这类问题已经问了很多年了,他们的答案通常是Screentmux

如果我知道我会长时间离开会话,或者网络太糟糕而无法保持可靠的连接,我肯定会在开始时使用screen

主要问题是当我开始某个会话并发现它必须持续很长时间之后,或者连接只是意外丢失。在后一种情况下,通常当我立即启动另一个会话时,我会发现之前的进程当时并没有被杀死,但是我无法重新连接到他们的终端。

所以我想知道是否有可能在意外断开 SSH 会话后防止正常进程被杀死甚至很长时间。最重要的是我可以重新连接到他们的终端无需提前在屏幕中启动它们

如果没有,是否可以将已经启动的裸 ssh 会话移动到新的 Screen 会话中以供以后重新连接?

【问题讨论】:

  • 出于好奇,你为什么不想调用screen?
  • @SpliFF 通常不是我不想这样做,而是因为正如我在问题中所说的那样为时已晚(意外断开连接或意识到我在中途会话中需要一个屏幕)。顺便说一句,屏幕还打破了腻子和 iterm 的回滚缓冲区,允许通过拖动滚动条轻松滚动,也许可以调整?但我只是懒得解决这个问题。
  • 请考虑使用mosh允许漫游的远程终端应用程序,支持间歇性连接,并提供智能的本地回显和用户击键的行编辑。

标签: session ssh tmux gnu-screen reconnect


【解决方案1】:

我不相信没有像屏幕这样的东西是可能的。一旦你的伪 TTY 丢失,我几乎可以肯定它无法从不同的 shell 中恢复(至少在没有一些 narly hack 的情况下不会)。

就将现有流程添加到新屏幕而言,我认为这是可能的。试试这里的说明:

http://monkeypatch.me/blog/move-a-running-process-to-a-new-screen-shell.html

首先要做的是暂停进程。在我的情况下,可以通过键入 Ctrl + Z 来暂停 Irssi。

其次,在后台恢复进程:

$bg

现在,我们将进程与其父进程(shell)分离。因此,当父进程终止时,子进程(Irssi)将能够继续。为此,我们使用 disown 内置函数:

$不承认irssi

启动屏幕会话:

$屏幕

当我们在屏幕会话中时,我们将检索 irssi 进程。为此,我们使用带有 pid 的 reptyr 命令:

$reptyr

为了避免繁琐的pid研究,我们可以使用pgrep命令:

$reptyr $(pgrep irssi)

现在该进程在屏幕外壳中,我们可以安全地分离会话,而不再担心杀死我们的 X 服务器或关闭我们的 ssh 连接。

为此,您需要reptyr

选项 2:

我怀疑您可能试图解决错误的问题。如果您的 SSH 连接断开,为什么不解决这个问题呢?您可以通过调整连接设置将 SSH 设置为对超时和断开连接的容忍度极高。

在您的客户端上,在$HOME/.ssh/config 添加:

ServerAliveInterval 60
ServerAliveCountMax 5

现在,即使服务器 5 分钟没有响应,您的会话也不会超时。

【讨论】:

  • 我不是很懂OPTION 2,我知道可以设置超时时间,但是一旦失去连接,一切都没有了吗?即使超时是inf,我还是不能重连?
  • 选项 2 首先是要尽量减少失去连接的机会。即使您的互联网中断了 4 分钟,上述选项也将让您的会话继续进行。但是,是的,一旦它真的消失了(比如客户端重启、意外关闭终端等),就差不多了。
  • 谢谢,我现在有了选项 2。但是选项1有一些问题:
  • 问题:1.如果我让旧终端打开并在新终端中执行reptyr,输出将绑定到新终端,但ctrl-z停止在新附加进程中工作(ctrl- c 仍然有效)。 2.如果旧终端已关闭,当reptyr进入新终端时,它会给出“[-] Timed out waiting for child stop。”并完全停止响应。 3. 似乎 reptyr 仍然不支持子进程(所以 shell 脚本通常不适用于 reptyr)。
  • 好的,我可能会遇到问题 2,disown 仅在终端结束时阻止 SIGHUP,但 stdout/in/err 仍连接到该终端,因此可能必须启动一个新终端并在此之前重新启动关闭旧的。这是有道理的。
【解决方案2】:

使用 ssh-tmux 代替 tmux:

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}

【讨论】:

    【解决方案3】:

    我使用nano 处理了一个文本文件,但我断开了连接。登录后,我看到上一个会话中的 nano 进程仍在运行,但我无法切换到该 nano 实例。所以,我杀死了 nano 进程,然后它创建了名为 filename.save 的文件。从第一次会议开始,我的变化就发生了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-16
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      相关资源
      最近更新 更多