Bash脚本来限制登录数量


12

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

我该如何实现?

请帮我。


3
MaxSessions现场服务器上将ssh中允许访问的最大连接数设置为20
George Udosen

2
如果您的公司有最多20个会话的策略,并且默认值为10个(如投票最高的答案所示),那么为什么您的公司将允许的会话数提高到> 20 in /etc/sshd_config,或者这是Ubuntu错误?
WinEunuuchs2Unix

如果第21个终端打开了,那么我想立即关闭该终端,那么前20个连接可以无限期占用服务器吗?
xenoid

Answers:


24

/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.

是的,它的作品有点晚了,无法将其添加为答案。
rɑːdʒɑ

2
我一直想暂时在我的一台旧笔记本电脑上设置SSSH。手册页上是否说默认情况下只有10个用户可以登录服务器?甚至在80年代,我们就有一百个用户登录具有2 MB RAM的IBM S / 36微型计算机。
WinEunuuchs2Unix

2
您将会话与开放式终端(请参阅OP)中的会话与SSH连接中的会话相混淆。您提到的设置是关于一个ssh连接允许多少个“子连接”。因此,即使使用,也可以运行30个“ ssh”命令MaxSessions 20。提到的会话涉及使用相同连接进行端口转发(甚至打开多个shell)之类的事情,而不是系统上的登录次数。
allo

@allo您从OP获得的此信息?
乔治·乌德森

1
@allo在这里是正确的,MaxSessions指的是通过单个TCP连接进行的会话多路复用。除非所有OP的用户都在做奇怪的事情以共享与服务器的单个TCP连接,否则此限制不会影响他们。我刚刚通过在服务器上设置一个较低的MaxSessions限制并打开了比它更多的连接来验证了这一点。
乔·李·

5

George的解决方案效果很好,但是您要求使用bash脚本...

因此,在没有诸如MaxSessionsof之类的选项的其他情况下,请考虑使用此方法sshd,然后可以使用以下方法:

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

pkill -n将杀死的最新实例processName

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


这样是否也可以防止子流程?
罗恩·约翰(RonJohn)'18

是的,它也导致子进程被杀死。
Ravexina '18

2
然后-鉴于bash派生了很多子流程,并且他们想限制用户而不是流程-这似乎不是一个有用的答案。
罗恩·约翰(RonJohn)'18

1
@RonJohn这是一个有用的答案,与用户要求(一个立即关闭进程的脚本)相对应,对于其他来自搜索引擎的用户(标题的一般答案)而言,直到您编辑问题为止。
Ravexina '18

让我进来 我也知道,这个地方根据提出的问题将用户引导到正确的道路。如果OP提出一个问题,并且正确的答案(基于OP的问题)不一定是最佳实践或正确的方法,我认为任何人都有权陈述这一观点或根据观察结果给出答案。我真的不认为我们应该选择确定哪个答案是让OP决定的最佳选择,我喜欢看到消息灵通的站点成员提供的许多选择。请让我们进行有建设性的辩论,如果没有其他人,它会对我有帮助!
乔治·乌德森

4

我已经决定详细阐述和检验Ravexina想法。如果您想完全限制已建立的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将执行默认用户的外壳程序。
  • 有害的影响是问候消息不再可用。
  • 不要忘记重启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

2

问题尚不清楚。首先,让我告诉我我如何理解它,以及应该以哪种方式向国际海事组织提出:

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

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

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

  1. 创建一个名为example的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问题下的另一个答案

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.