![限制登录次数的 Bash 脚本](https://linux22.com/image/1159981/%E9%99%90%E5%88%B6%E7%99%BB%E5%BD%95%E6%AC%A1%E6%95%B0%E7%9A%84%20Bash%20%E8%84%9A%E6%9C%AC.png)
我公司要求我运行一个服务器应用程序,所有用户都通过 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 脚本......
因此,当没有像MaxSessions
of 这样的选项时,请考虑其他情况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
。
创建一个名为 的组,
the-app-maxlogins
其组 ID 为10 000
:sudo groupadd -g 10000 the-app-maxlogins
将用户添加到该组-
sudo adduser <user> <group>
:for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
将下一行添加
/etc/security/limits.conf
到限制maxlogins 的整个团体:%the-app-maxlogins - maxlogins 20
或者将以下行添加到限制最大登录次数群组中每个用户:
@the-app-maxlogins - maxlogins 20
编辑
/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 问题下。
这其他答案我的方法可以以某种方式提供解决方法,但这是一种乐趣,而不是真正的解决方案。