限制登录次数的 Bash 脚本

限制登录次数的 Bash 脚本

我公司要求我运行一个服务器应用程序,所有用户都通过 putty 终端访问它。我想编写一个 shell 脚本,只打开 20 个 putty 终端。如果第 21 个终端打开,那么我想立即关闭该终端。

我怎样才能实现这个目标?

请帮我。

答案1

在服务器端编辑您的/etc/sshd_config并更改行:

#MaxSessions 10

MaxSessions 20

man sshd_config

 MaxSessions
         Specifies the maximum number of open shell, login or subsystem
         (e.g. sftp) sessions permitted per network connection.  Multiple
         sessions may be established by clients that support connection
         multiplexing.  Setting MaxSessions to 1 will effectively disable
         session multiplexing, whereas setting it to 0 will prevent all
         shell, login and subsystem sessions while still permitting for-
         warding.  The default is 10.

答案2

乔治的解决方案很好用,但是你要求使用 bash 脚本......

因此,当没有像MaxSessionsof 这样的选项时,请考虑其他情况sshd,然后您可以使用如下方法:

if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi; 

pkill -n将终止 的最新实例processName

针对这种特殊情况的正确解决方案是乔治的答案。

答案3

我决定详细阐述并测试拉维西纳主意。如果您想限制已建立的 ssh 连接数,它是可行的,而且非常有效。

首先,我发现当 ssh 守护进程在没有任何连接的情况下运行时,会有一个sshd进程。对于每个新连接,sshd都会创建两个新进程。因此,如果您希望限制 20 个连接,则阈值应该是41(1+2x20)而不是 20。

然后我创建了一个名为的可执行文件,其内容如下:/usr/local/bin/limit-sshd

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    pkill -xn sshd
fi
  • 这里的阈值是7,分别只能建立3个连接,其余的将被丢弃。

最后,我添加了以下指令/etc/ssh/sshd_config

ForceCommand /usr/local/bin/limit-sshd; $SHELL
  • 该变量$SHELL将执行默认用户的 shell。
  • 一个不良后果是问候消息不再可用。
  • 不要忘记重新启动 ssh 守护进程:sudo systemctl restart sshd.service

工作原理如下(点击图片观看动画演示):

在此处输入图片描述

此外,我意识到如果我们以这种方式修改脚本,我们不需要终止任何东西:

#!/bin/sh
if [ "$(pgrep -cx sshd)" -gt 7 ]
then
    echo '\nThe limit was reached!\n'
    exit # This line is not mandatory
else
    eval "$SHELL"
fi

并分别/etc/ssh/sshd_config如下:

ForceCommand /usr/local/bin/limit-sshd

答案4

问题不清楚。首先让我告诉你我是如何理解它的,以及在我看来应该以哪种方式提出这个问题:

我们有一个本地网络,其中一台服务器提供特定的应用程序。我们的团队使用 PuTTY 通过从他们的计算机到服务器的 ssh 连接访问此应用程序。每个团队成员都有自己的用户帐户,用于建立 ssh 连接(或者可能:所有团队成员都使用一个共同的用户帐户)。

团队成员不将服务器用于任何其他目的,我们希望将他们的 ssh 连接数限制为 20 个,无论特定用户建立了多少个连接(或者可能:每个用户 20 个连接)。

如果这种解释是正确的,那么满足要求的正确方法可能是创建一个用户组,然后将所有用户帐户添加到该组并限制最大登录数通过/etc/security/limits.conf

  1. 创建一个名为 的组,the-app-maxlogins其组 ID 为10 000

    sudo groupadd -g 10000 the-app-maxlogins
    
  2. 将用户添加到该组- sudo adduser <user> <group>

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
    
  3. 将下一行添加/etc/security/limits.conf限制maxlogins 的整个团体

    %the-app-maxlogins      -       maxlogins       20
    

    或者将以下行添加到限制最大登录次数群组中每个用户

    @the-app-maxlogins      -       maxlogins       20
    
  4. 编辑/etc/ssh/sshd_config并将以下行添加到文件底部(!)以禁用该组的会话多路复用(在这种情况下这可能不是强制性的):

    Match Group the-app-maxlogins
        MaxSessions 1
    

此解决方案将限制受影响用户的登录次数,无论是通过 ssh 还是 tty。如果您要将其应用于特定用户而不是组,只需添加一行如下内容limits.conf或将其放入.conf目录中的单独文件中/etc/security/limits.d/

username      -       maxlogins       20

MaxSessions有关该指令实际含义的简单解释,请参见这个答案。当前答案的主要来源是另一个答案在同一个 L&U 问题下。

其他答案我的方法可以以某种方式提供解决方法,但这是一种乐趣,而不是真正的解决方案。

相关内容