如何在Linux中断开空闲的ssh会话或者保持空闲的ssh会话处于活动状态

时间:2020-01-09 10:38:12  来源:igfitidea点击:

如何断开空闲的SSH会话?
Linux终止ssh会话。
一段时间后Linux SSH关闭连接。
ssh空闲超时。
在Linux中保持空闲的ssh会话处于活动状态。
断开空闲的ssh会话超时。
ssh关闭会话超时。
ssh超时。
ssh空闲超时Linux。
自动断开空闲的ssh会话Linux。
在Linux中自动杀死不活动的ssh会话。
在Linux中自动断开空闲的ssh会话。
在Unix中终止不活动的ssh会话。
ssh在一段时间后关闭连接。
如何与SSH断开连接

什么是空闲的SSH会话?

其中我们的意思是在主机和客户端之间建立了ssh连接,但用户对此连接没有任何活动,因此被认为是空闲的。
其中尽管ssh会话未处于阻塞状态。
我们可以"列出所有活动的ssh连接",然后检查单个源主机的空闲时间。

在本文中,我将分享技巧,以自动断开空闲的SSH会话,并避免断开与空闲SSH会话的连接。
在上一篇文章中,我分享了"在Linux中终止无响应的SSH会话的步骤和示例"。

断开空闲SSH会话的技巧是使用下面两个带有适当值的参数来实现此方案:即断开空闲SSH会话,并确保SSH会话在空闲时不会断开连接

  • ClientAliveInterval

  • ClientAliveCountMax

但是在断开任何此类ssh会话的连接之前,了解Linux节点上当前活动的SSH会话也很重要。

有多种ssh身份验证方法,我们可以根据需要使用带有或者不带有密码的ssh身份验证方法连接到Linux节点。

从手册页

ClientAliveCountMax
             Sets the number of client alive messages which Jan be sent without sshd(8) receiving any messages back from the client.  If this threshold is reached
             while client alive messages are being sent, sshd will disconnect the client, terminating the session.  It is important to note that the use of client
             alive messages is very different from TCPKeepAlive.  The client alive messages are sent through the encrypted channel and therefore will not be
             spoofable.  The TCP keepalive option enabled by TCPKeepAlive is spoofable.  The client alive mechanism is valuable when the client or server depend
             on knowing when a connection has become inactive.
             The default value is 3.  If ClientAliveInterval is set to 15, and ClientAliveCountMax is left at the default, unresponsive SSH clients will be disconnected after approximately 45 seconds.
     ClientAliveInterval
             Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through the encrypted channel to request a response from the client.  The default is 0, indicating that these messages will not be sent to the client.

断开空闲的SSH会话的连接(一段时间后SSH关闭连接)

要断开空闲的SSH会话(即在一段时间后ssh关闭连接),请确保" ClientAliveCountMax"为" 0"。
因为当为0时,如果客户端在一段时间内处于非活动状态(如由ClientAliveInterval所提供),则sshd不会在一段时间后发送客户端活动消息和ssh关闭连接。

说明:

一段时间后,将客户端节点(而不是服务器端)上的ClientAliveCountMax的值更改为ssh关闭连接。
假设我们正在从" node1"→" node2"执行SSH,则在" node2"上应用这些更改,以便在空闲时间超过定义的时间后,从任何节点到" node2"的SSH连接都将断开连接。

在node2的/etc/ssh/sshd_config中查找ClientAliveCountMax的当前分配值。

说明:

sshd_config中可能不存在此变量。
这意味着sshd_config文件是自定义的,没有人为ClientAliveCountMax定义值。
要获得未分配变量的默认值,必须从sshd_config获取所有变量的值,我们可以使用sshd -T查看该变量。

# sshd -T | grep -i client
clientaliveinterval 10
clientalivecountmax 1

接下来在客户端节点上的/etc/ssh/sshd_config中为ClientAliveCountMax分配一个空值,对我来说它是node2

node2:~ # grep ClientAliveCountMax /etc/ssh/sshd_config
ClientAliveCountMax 0

现在,我们还应该分配一个时间间隔,在该时间间隔内,允许会话在空闲时处于活动状态。
可以在我的客户端节点上的/etc/ssh/sshd_config文件中再次使用ClientAliveInterval来定义,即node2

node2:~ # grep ClientAliveInterval /etc/ssh/sshd_config
ClientAliveInterval 10

为了本文方便,我将间隔时间设置为10秒。
我们可以根据需要更改此值。

重新启动sshd服务并检查状态

node2:~ # systemctl restart sshd
node2:~ # systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-05-31 16:16:20 IST; 51s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 19792 (sshd)
   CGroup: /system.slice/sshd.service
           └─19792 /usr/sbin/sshd -D
Jan 31 16:16:20 node2 systemd[1]: Starting OpenSSH server daemon...
Jan 31 16:16:20 node2 sshd[19792]: Server listening on 192.150.20.2 port 22.
Jan 31 16:16:20 node2 sshd[19792]: Server listening on node2 port 22.
Jan 31 16:16:20 node2 systemd[1]: Started OpenSSH server daemon.

接下来,让我们启动从节点1到节点2的SSH会话

[root@node1 ~]# ssh -v root@node2

使用w监视node2上的空闲SSH会话,以确保在空闲一段时间后ssh关闭连接

[root@node2 ~]# w
 16:21:11 up  7:04,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.2.2         09:17    7.00s  0.26s  0.01s w
root     pts/1    10.0.2.31        16:21    2.00s  0.03s  0.03s -bash
[root@node2 ~]# w
 16:21:14 up  7:04,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.2.2         09:17    2.00s  0.26s  0.00s w
root     pts/1    10.0.2.31        16:21    5.00s  0.03s  0.03s -bash
[root@node2 ~]# w
 16:21:17 up  7:04,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.2.2         09:17    5.00s  0.26s  0.00s w
root     pts/1    10.0.2.31        16:21    8.00s  0.03s  0.03s -bash
[root@node2 ~]# w
 16:21:19 up  7:04,  2 users,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.2.2         09:17    7.00s  0.26s  0.00s w
root     pts/1    10.0.2.31        16:21   10.00s  0.03s  0.03s -bash
[root@node2 ~]# w
 16:21:20 up  7:04,  1 user,  load average: 0.00, 0.01, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.2.2         09:17    0.00s  0.28s  0.02s w

如我们所见,在从node1到node2的ssh会话闲置10秒后,SSH会在一段时间后自动关闭连接。
下面的调试消息可以在我的node1上看到

[root@node2 ~]# debug1: channel 0: free: client-session, nchannels 1
Connection to node2 closed by remote host.
Connection to node2 closed.
Transferred: sent 2220, received 2412 bytes, in 10.4 seconds
Bytes per second: sent 213.8, received 232.3
debug1: Exit status -1

说明:

这些调试消息可用,因为我已使用-v在调试模式下执行了SSH

因此,我们的空闲SSH会话在等待10秒钟后会自动断开连接。

保持闲置SSH会话处于活动状态(ClientAliveInterval和ClientAliveCountMax)

在上面的内容中,我向我们展示了确保空闲的SSH会话自动断开连接的技巧。
现在,如果这成为问题,则可以将ClientAliveCountMax的值增加到非零值。

另外,我们还可以在客户端节点的" sshd_config"中使用" TCPKeepAlive"。

在sshd_config的手册页中:

TCPKeepAlive
             Specifies whether the system should send TCP keepalive messages to the other side.  If they are sent, death of the connection or crash of one of the
             machines will be properly noticed.  However, this means that connections will die if the route is down temporarily, and some people find it annoying.
             On the other hand, if TCP keepalives are not sent, sessions Jan hang indefinitely on the server, leaving "ghost" users and consuming server
             resources.
             The default is yes (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes.  This avoids in‐
             finitely hanging sessions.
             To disable TCP keepalive messages, the value should be set to no.

为了本文的目的,我将使用以下值

[root@node2 ~]# vim /etc/ssh/sshd_config			 
ClientAliveInterval 5m  # 5 minutes 
ClientAliveCountMax 3   # 3 times

如果客户端在5分钟内处于非活动状态,则sshd将通过加密通道发送称为"客户端活动消息"的消息,以请求来自客户端的响应。
sshd守护程序最多将这些消息发送三遍。
如果在发送"客户端活动消息"时达到此阈值,则sshd将断开客户端上的空闲ssh会话的连接。

这些值也可以与ServerAliveInterval和ServerAliveCountMax结合使用,以自动断开挂起或者无响应的SSH会话。

接下来重启sshd服务并检查状态

[root@node2 ~]# systemctl restart sshd
[root@node2 ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-05-31 16:37:06 IST; 1s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 9866 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           └─9866 /usr/sbin/sshd -D
Jan 31 16:37:06 node2.example.com systemd[1]: Stopped OpenSSH server daemon.
Jan 31 16:37:06 node2.example.com systemd[1]: Starting OpenSSH server daemon...
Jan 31 16:37:06 node2.example.com sshd[9866]: Server listening on 0.0.0.0 port 22.
Jan 31 16:37:06 node2.example.com sshd[9866]: Server listening on :: port 22.
Jan 31 16:37:06 node2.example.com systemd[1]: Started OpenSSH server daemon.