Моя компания имеет требование, чтобы у меня было одно выполнение серверного приложения, который все пользователи, получающие доступ к ней через терминал шпаклевки. Я хочу записать сценарий оболочки, что только 20 терминалов шпаклевки должны быть открыты. Если 21-й терминал открывается затем, я хочу закрыть тот терминал сразу.
Как я могу достигнуть этого?
Пожалуйста, помогите мне.
У нас есть локальная сеть, где один сервер поставляет определенное приложение. Наша команда получает доступ к этому приложению через ssh-соединение со своих компьютеров на сервер с помощью PuTTY. Каждый член команды имеет свою собственную учетную запись пользователя, которая используется для установки соединений ssh ( или, может быть, все члены команды используют общую учетную запись пользователя).
Члены команды не используют сервер для каких-либо других целей, и мы хотим ограничить количество их соединений ssh до 20, независимо от того, сколько соединений установлено конкретным пользователем ( или может быть: 20 подключений на пользователя).
blockquote>Если эта интерпретация верна, вероятно, правильный способ выполнить требования - создать группу пользователей , затем добавить все учетные записи пользователей в эту группу и ограничить количество макслогинс через
/etc/security/limits.conf
.
Создать группу, например, с именем
the-app-maxlogins
, с идентификатором группы10 000
:sudo groupadd -g 10000 the-app-maxlogins
Добавить пользователей в эту группу - [ 119]:
for user in "user1" "user2" "user3"; do sudo adduser "$user" the-app-maxlogins; done
Добавить следующую строку к
/etc/security/limits.conf
- ограничить макслогинов всей группы :%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.Другой мой ответ мой, может каким-то образом обойти, но это скорее забавное, нежели истинное решение.
Отредактируйте Ваш /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.
Решение George хорошо работает однако, Вы попросили сценарий удара...
Поэтому рассмотрите этого для других ситуаций, когда не будет никакой опции как MaxSessions
из sshd
, затем можно использовать что-то вроде этого:
if [ "$(pgrep -cx processName)" -gt 20 ]; then pkill -xn processName; fi;
Который pkill -n
уничтожит новейший экземпляр processName
.
Правильное решение для этой специальной ситуации является ответом George.
Я решил разработать и протестировать идею 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
Наконец я добавил следующую директиву к /etc/ssh/sshd_config
:
ForceCommand /usr/local/bin/limit-sshd; $SHELL
$SHELL
выполнит оболочку пользователя по умолчанию.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