
Я хочу предотвратитьинтерактивныйинеинтерактивныйВход по ssh на основе условной логики. Мне нужно проверить имя пользователя и выдать сообщение об ошибке.
Людям, использующим sftp (неинтерактивный ssh), также следует пройти тест на удачу.
Как бы я это реализовал? У меня полный контроль над системой.
Я пробовал использовать sshd ForceCommand, но согласноhttps://stackoverflow.com/a/33714333/746461это не работает для notty.
Я не знаком с PAM и сомневаюсь, что PAM может выводить пользовательское сообщение об ошибке в случае интерактивного входа.
https://linuxhint.com/understanding_bash_shell_configuration_startup/говорит, что неинтерактивная оболочка входа с --noprofile
опцией может обойти все файлы конфигурации bash. Вот почему я не могу написать там свою логику.
решение1
Я понял. Я могу реализовать модуль PAM, чтобы сделать это.
Сохраните следующее, например, в файл /root/checkConnections
.
#! /bin/bash
limit=$1
c=$(pgrep -xcu $PAM_USER sshd)
if [[ $c -ge "$limit" ]]; then
echo "Max $limit ssh connections allowed, but you have $c."
exit 1
fi
Затем в /etc/pam.d/sshd добавьте
session required pam_exec.so stdout /root/checkConnections 5
pam_exec.so
выполняет скрипт оболочки, stdout
выводит сообщения в терминал пользователя.
Когда условие не выполняется, эффект будет таким.
$ ssh localhost
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-74-generic x86_64)
94 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable
Max 5 ssh connections allowed, but you have 5.
/root/checkConnections failed: exit code 1
Last login: Thu Jun 24 12:19:27 2021 from 172.18.33.67
Connection to localhost closed.