避免 ssh 连接超时和冻结 GNOME 终端的方法

Kzq*_*qai 248 ssh terminal timeout gnome-terminal

当我通过 ssh 连接到某些服务器时,它会超时并“冻结”终端(不接受输入,不会断开连接,不能 Ctrl-C 终止 ssh 进程或任何其他东西)。

这是在 Ubuntu 中,gnome-terminal虽然它似乎暂停了终端输入/输出,但不影响 GNOME 终端软件本身的操作。gnome-terminal与其说是令人讨厌的 ssh 不一致,不如说是一个错误。

那么,有没有办法阻止/从已超时的 ssh 连接中恢复终端?

Lud*_*erl 266

如果 sshd(服务器)在一段时间内没有收到来自客户端的任何消息,它就会关闭连接。您可以告诉您的客户端偶尔向服务器发送生命迹象信号。

这个配置在文件中~/.ssh/config。要每四分钟向远程主机发送信号,请将以下内容放入您的~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240
Run Code Online (Sandbox Code Playgroud)

这就是我在我的~/.ssh/config.

要为所有主机启用它,请使用:

Host *
  ServerAliveInterval 240
Run Code Online (Sandbox Code Playgroud)

还要确保运行chmod 600 ~/.ssh/config,因为配置文件不能是世界可读的。

  • 如果您的连接实际上丢失了,这将毫无用处... (6认同)

Pet*_*aut 264

依次按Enter~.可断开冻结的会话。

ssh 手册页中的“转义字符”部分解释了底层细节。

  • 在我看来,这个答案更准确地回答了这个问题,无论如何,这就是我正在寻找的答案。 (41认同)
  • @Mark 问题是“有没有办法防止从 ssh 连接 __that has timeout__ 重新获得终端?” 强调我的。 (2认同)
  • 尽管在问题的上下文中它是不正确的,但这正是我想要的。 (2认同)

小智 39

尽管这不是您问题的直接答案,但它与您遇到的问题高度相关。而不是试图保持连接(所有连接最终死亡),可以使用终端复用器,像screentmux该会话保持活动状态,即使你的终端断开连接的背景。

本质上,当您登录到 SSH 服务器时,您会立即运行screen它将创建并附加一个新会话:

$ screen
Run Code Online (Sandbox Code Playgroud)

然后,您继续像往常一样使用 shell 进行工作。现在,如果连接断开,当您可以重新联机并通过 SSH 重新连接到服务器时,您将获得当前会话的列表:

$ screen -ls
Run Code Online (Sandbox Code Playgroud)

要重新连接到会话:

$ screen -r <session>
Run Code Online (Sandbox Code Playgroud)

<session>PID 或会话名称在哪里。您将重新连接到您的会话,您可以从上次中断的地方继续!

您甚至可以断开会话并从家中重新连接,以从上次中断的确切位置继续。要分离您使用的会话,C-a后跟C-d(thats Control + Aand then Control + D)。

还有简单的在线教程

在远程服务器上使用screentmux被认为是最佳实践强烈建议使用。有些人甚至使用screen他们的默认登录 shell,所以当他们连接时,他们会立即开始一个新的screen会话。

  • 另一种选择是使用 mosh:https://mosh.mit.edu/ (2认同)

Fer*_*gie 13

尝试附加-o ServerAliveInterval=30到您的连接字符串(30意味着 30 秒,当然可以调整)


小智 6

您还可以从 SSH 服务器端设置空闲超时间隔:

文件: /etc/ssh/ssh_config

内容:

ClientAliveInterval XX
ClientAliveCountMax YY
Run Code Online (Sandbox Code Playgroud)

这与客户端设置的工作方式完全相同,但从服务器而不是客户端发送空数据包。

摘自:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html