Сценарий Bash для ограничения количества логинов

Моя компания имеет требование, чтобы у меня было одно выполнение серверного приложения, который все пользователи, получающие доступ к ней через терминал шпаклевки. Я хочу записать сценарий оболочки, что только 20 терминалов шпаклевки должны быть открыты. Если 21-й терминал открывается затем, я хочу закрыть тот терминал сразу.

Как я могу достигнуть этого?

Пожалуйста, помогите мне.

12
задан 31 August 2018 в 03:55

4 ответа

1129 Вопрос не ясен. Позвольте мне сначала рассказать, как я понимаю это и каким образом, IMO, следует спросить:

У нас есть локальная сеть, где один сервер поставляет определенное приложение. Наша команда получает доступ к этому приложению через ssh-соединение со своих компьютеров на сервер с помощью PuTTY. Каждый член команды имеет свою собственную учетную запись пользователя, которая используется для установки соединений ssh ​​( или, может быть, все члены команды используют общую учетную запись пользователя).

Члены команды не используют сервер для каких-либо других целей, и мы хотим ограничить количество их соединений ssh ​​до 20, независимо от того, сколько соединений установлено конкретным пользователем ( или может быть: 20 подключений на пользователя).

Если эта интерпретация верна, вероятно, правильный способ выполнить требования - создать группу пользователей , затем добавить все учетные записи пользователей в эту группу и ограничить количество макслогинс через /etc/security/limits.conf .

  1. Создать группу, например, с именем the-app-maxlogins, с идентификатором группы 10 000:

    sudo groupadd -g 10000 the-app-maxlogins
    
  2. Добавить пользователей в эту группу - [ 119]:

    for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
    
  3. Добавить следующую строку к /etc/security/limits.conf - ограничить макслогинов всей группы :

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

Другой мой ответ мой, может каким-то образом обойти, но это скорее забавное, нежели истинное решение.

2
ответ дан 23 November 2019 в 03:29

Отредактируйте Ваш /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.
24
ответ дан 23 November 2019 в 03:29

Решение George хорошо работает однако, Вы попросили сценарий удара...

Поэтому рассмотрите этого для других ситуаций, когда не будет никакой опции как MaxSessions из sshd, затем можно использовать что-то вроде этого:

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

Который pkill -n уничтожит новейший экземпляр processName.

Правильное решение для этой специальной ситуации является ответом George.

5
ответ дан 23 November 2019 в 03:29

Я решил разработать и протестировать идею 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

Вот то, как это работает (нажмите на изображение для наблюдения анимированной демонстрации):

enter image description here

Далее, я понял, что мы ничего не должны уничтожать, если мы изменяем сценарий таким образом:

#!/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
ответ дан 23 November 2019 в 03:29

Другие вопросы по тегам:

Похожие вопросы: