如何在 Linux 中断开非活动或空闲的 SSH 连接?

linuxoperating systemopen source

简介

安全 Shell (SSH) 是一种支持两个系统之间安全通信的协议。在 Linux 中,SSH 被广泛用于远程访问和管理服务器。该工具在客户端和服务器之间建立安全连接,加密传输的信息,以防止未经授权的实体拦截。

在 Linux 中,当用户通过命令行界面登录远程计算机时,就会创建 SSH 连接。用户可以在远程主机上执行命令,就像他们实际在该计算机上一样。这样,系统管理员和网络工程师就可以从单个终端或工作站管理多台计算机,而无需不断切换设备。

识别非活动或空闲的 SSH 连接

在断开非活动或空闲的 SSH 连接之前,首先要识别它们。在 Linux 中,有多个命令可用于列出活动用户及其会话、显示已登录用户及其进程的信息,以及查看之前的登录和会话日志。

使用"who"命令列出活动用户及其会话

"who"命令用于显示当前登录用户的列表,包括他们的登录名、终端线路号 (tty)、登录时间以及远程主机名或 IP 地址。如果要专门查看 SSH 连接,可以在命令中添加"-u"选项。这将仅显示活动的 SSH 连接及其相应的用户信息。

who -u

使用"w"命令显示已登录用户及其进程的信息

"w"命令提供有关所有登录用户的详细信息,包括他们在系统上执行的操作。输出包含用户名、终端号、远程主机地址、登录时间以及每个用户下正在运行的进程等列。只需在终端上输入"w",即可获得通过任何方式(包括 ssh、控制台、GUI 等)连接到系统的每个人的所有这些详细信息。

使用"last"命令查看之前的登录和会话日志

"last"命令会显示所有之前登录过的用户列表,按最近登录的顺序排列。它还会显示用户上次登录的时间、位置/终端/IP。 "last" 提供的另一个重要信息是,是否存在任何意外终止,例如电源故障或网络中断等。

last

了解用于识别非活动或空闲 SSH 连接的各种命令对于维护安全高效的系统至关重要。

手动断开非活动或空闲的 SSH 连接

如果您已识别出非活动或空闲的 SSH 连接并希望手动终止它,则可以使用多个命令来执行此操作。这些命令专门针对与 SSH 连接关联的进程,允许您在不影响系统上任何其他进程的情况下终止它们。

使用"kill"命令终止特定会话 ID

"kill"命令用于向特定进程(或多个进程)发送信号以终止它们。要断开非活动或空闲的 SSH 连接,您可以使用与该连接关联的会话 ID 的"kill"命令。

要确定非活动或空闲 SSH 连接的会话 ID,您可以使用本文第二部分中提到的任何方法。确定会话 ID 后,只需运行以下命令 -

kill [sessionID]

这将立即终止该特定的 SSH 连接并注销与其关联的所有用户。

使用"pkill"命令终止与特定用户关联的所有进程

如果您想一次性断开特定用户的所有非活动或空闲 SSH 连接,可以使用"pkill"命令。此命令不仅会向特定进程发送信号,还会终止所有其他相关进程。要终止某个特定用户的所有连接,请运行以下命令 -

pkill -U [username]

这将发送信号并终止 [用户名] 打开的所有 SSH 连接。

使用"skill"命令发送信号终止特定进程

有时使用 kill 或 pkill 方法可能会终止与活动会话相关的其他进程。确定哪些进程与活动的 SSH 连接关联并不总是那么容易,因此您可以改用"skill"命令。"skill"命令允许您按名称、用户或组定位特定进程。

您可以使用它发送信号,终止任何与特定模式匹配的进程。要终止特定的 SSH 会话,请运行以下命令 -

skill -KILL -u [用户名] --tty=[终端] 这将发送信号终止 [用户名] 在指定终端上打开的所有 SSH 连接。skill 命令还可以终止终端中正在运行的其他进程。

自动断开非活动或空闲的 SSH 连接

在本节中,我们将讨论在 Linux 中自动断开非活动或空闲 SSH 连接的两种方法:使用 cron 作业创建自动脚本,以及使用 sshd_config 文件设置自动断开连接。

使用 cron 作业创建自动脚本

Cron 是 Linux 中基于时间的作业调度程序,允许您通过安排任务以特定间隔运行来实现自动化。要创建用于断开非活动或空闲 SSH 连接的自动脚本,您可以结合使用我们之前讨论过的命令:"who"、"w"、"last"、"kill"和/或"skill"。

您可以编写一个简单的 Bash 脚本来检查非活动会话并自动终止它们。首先,打开终端并输入 -

$ crontab -e

此命令将以编辑模式打开 crontab 文件。然后在文件末尾添加以下行 -

* * * * * /path/to/script.sh

这会告诉 cron 每分钟执行我们的脚本。接下来,输入以下命令创建一个新的 Bash 脚本:-

$ nano /path/to/script.sh

现在将这段代码复制并粘贴到文件中:-

#!/bin/bash

users=$(who | awk '{print $1}' | sort -u) for user in $users
do idle=$(w -h "$user" | awk '{print $5}')
if [[ "$idle" -gt "1800" ]]; then pkill -u "$user"
fi done

此脚本将每分钟检查一次空闲会话,并终止空闲时间超过 30 分钟(1800 秒)的用户会话。您可以通过修改"if"语句中的数字来更改此阈值。

使用 sshd_config 文件设置自动断开连接

自动断开非活动 SSH 连接的另一种方法是修改 sshd_config 文件。此文件包含 SSH 服务器的配置设置,包括会话超时值。默认情况下,SSH 会话没有超时值,这意味着空闲会话将无限期保持打开状态。

设置会话超时值 −

打开终端并输入 −

$ sudo nano /etc/ssh/sshd_config

添加或修改以下行:

ClientAliveInterval 300 ClientAliveCountMax 2

上述配置将会话超时值设置为五分钟(300 秒)。"ClientAliveCountMax"选项指定服务器在终止非活动会话之前应向客户端发送保持活动消息的次数。

使用 CTRL+X,然后按 Y,最后按 ENTER 保存并关闭文件。

使用以下命令重启 SSH 服务:

$ sudo systemctl restart sshd.service

此配置将确保非活动会话在五分钟后终止。如果在此期间没有任何活动,服务器将在终止非活动会话之前向客户端发送两次保持活动状态的消息。自动断开非活动或空闲的 SSH 连接对于维护系统安全和性能至关重要。

结论

正如我们所见,空闲或非活动的 SSH 连接可能会对您的 Linux 服务器构成安全风险。如果这些连接无人看管,攻击者可能会控制休眠会话并获得对您系统的未经授权的访问。因此,跟踪活动的 SSH 会话并及时断开空闲或非活动的 SSH 连接至关重要。


相关文章


有用资源