Contents

保持SSH会话

1. 概述

有时我们需要保持SSH 会话处于活动状态以保持应用程序运行,或者只是为了避免在返回到我们正在使用的 SSH 窗口时感到沮丧。

在本教程中,我们将了解如何通过防止 SSH 会话超时或直到我们物理关闭终端/bash 窗口来保持 SSH 会话处于活动状态。

2. 为什么 SSH 会关闭连接?

为了让我们使用 SSH 连接到服务器,ssh 守护进程 (sshd) 必须在目标服务器上运行。如果客户端不定期向服务器发送信息,那么服务器会在经过一定时间后关闭连接。

为了防止服务器关闭我们的 SSH 连接,我们可以在客户端机器或服务器上配置一个配置文件。

3. 设置配置文件

有几个文件可以更新,以帮助防止 SSH 会话超时,具体取决于我们是客户端还是服务器端。

3.1.客户端配置文件

客户端配置文件的位置是$HOME/.ssh/config。**如果我们打开终端并输入cat $HOME/.ssh/config,我们可能会收到一条消息“找不到文件” :

$ cat $HOME/.ssh/config
cat: /.ssh/config: No such file or directory

如果我们看到上面的消息,那么我们必须手动创建配置文件如果.ssh文件夹不存在,我们可以先创建它:

$ mkdir $HOME/.ssh

如果此文件夹已存在,我们将看到一条消息“文件存在”。如果该文件夹不存在,我们将看不到任何输出。无论哪种方式,我们现在都准备好创建配置文件了。我们可以使用touch命令来做到这一点:

$ touch $HOME/.ssh/config

一旦我们创建了配置文件,我们还必须运行chmod 命令以确保该文件不是世界可读的:

$ chmod 600 $HOME/.ssh/config

我们现在可以使用任何文本编辑器(例如nanovim )将我们的规则添加到配置文件中。通过运行nano $HOME/.ssh/config我们在终端/bash 窗口内的基本文本编辑器中打开配置文件。

现在让我们在配置中添加几行:

Host example
    Hostname example.com
    ServerAliveInterval 240

此配置指定仅在 SSH 会话连接到示例域时应用的设置。

ServerAliveInterval是客户端向服务器发送信号之前的时间量(以秒为单位)。

在编辑器中输入上述文本后,我们必须按Ctrl+O,然后按**[Enter]覆盖我们在上一步中创建的配置文件。然后要退出 nano,我们必须按Ctrl+X**。

或者,我们可以用 * 替换example为我们通过 SSH 连接的任何域设置此规则:

Host *
    ServerAliveInterval 240

我们可以使用相同的步骤来使用nano打开和保存配置文件。

3.2. 服务器端配置文件

在某些情况下,我们可能可以访问服务器上的配置文件。如果是这种情况,我们可以配置我们希望服务器何时关闭 SSH 连接

在服务器上编辑配置文件的过程类似于客户端配置文件,但有一些不同之处。

一、服务器端config文件的文件位置是/etc/ssh/sshd_config **

现在我们使用nanoClientAliveInterval关键字添加到配置文件中。

请注意,此关键字在其中使用“客户端”而不是我们在前面示例中看到的“服务器”。

ClientAliveInterval 60

ClientAliveInterval是以秒为单位指定的超时间隔。如果服务器从客户端接收到数据后的时间超过了超时间隔,则服务器将向客户端发送消息请求响应。

3.3. 为什么不设置为永不断开连接?

虽然将 SSH 会话设置为永不断开连接可能很诱人,但在某些情况下,我们为 SSH 设置超时会更明智

如果我们连接的服务器是我们自己维护的,那么设置超时可能没有充分的理由。但是,如果我们将服务器托管在AWS E3 等平台上,如果我们不设置 timeout 可能会变得昂贵。许多云托管平台对使用服务器每分钟收费,即使我们没有积极使用它,保持 SSH 会话持续活动也会增加成本。

要在客户端上配置超时,我们可以在与上述相同的配置文件中使用ServerAliveCountMax关键字:

Host *
    ServerAliveInterval 240
    ServerAliveCountMax 2

不再让客户端每 240 秒继续发送信号,客户端现在还将侦听从服务器返回的信号。如果它通过ServerAliveInterval两次而没有收到信号,它将关闭 SSH 会话。

同样,我们可以在服务器上设置类似的配置:

ClientAliveInterval 60
ClientAliveCountMax 2

这将每 60 秒从服务器向客户端发送一个信号。如果它通过ClientAliveInterval两次而没有从客户端收到信号,则服务器将关闭 SSH 会话。

这通常是由于客户端和服务器之间的网络断开连接。

在大多数情况下,**客户端配置需要设置为低于服务器默认超时的值。**服务器上默认禁用连接终止,因此如果不想更改此行为,我们不需要调整服务器配置。

如果没有为ServerAliveCountMaxClientAliveCountMax提供值,则默认值 3 将应用于两者。