У меня есть небольшой SSH-сервер, и я хотел бы написать сценарий, который будет запускаться каждый раз, когда кто-то входит в систему через SSH.
Как мне это сделать?
Я бы хотел, чтобы сценарий запускался каждый раз, когда ЛЮБОЙ вход в систему, и мне нужно иметь доступ, по крайней мере, к имени пользователя, который вошел в систему, и IP-адресу, с которого он вошел.
Я думал об использовании /etc/bash.bashrc
, но разве это хорошее решение? Например, есть ли способ, которым пользователь может отключить его использование и, таким образом, отключить мой сценарий? Если да, то каковы другие варианты?
Спасибо.
Механизм использования зависит от ваших целей.
Если вы хотите что-то предоставить удобный или дружелюбный для ваших пользователей, тогда ваш /etc/profile
достаточно разумно, если все ваши пользователи используют одну и ту же оболочку. Если вы хотите, чтобы команды выполнялись только при входе через ssh
, поместите команды в /etc/ssh/sshrc
. (Если вы не против того, чтобы пользователи переопределяли команды своими собственными ~/.ssh/rc
файл.)
Если хочешь сила пользователь для выполнения одной программы, и только одна программа, то ForceCommand
вариант, описанный DigitalRoss, является хорошим подходом. (Лично я бы дополнительно ограничил пользователя принудительный контроль доступа система, такая как AppArmor, SELinux, ТОМОЙО, или ХЛОПАТЬ, чтобы гарантировать, что программа не может позволить пользователю сбежать. Я работал над AppArmor десять лет, так что это инструмент, который я выбрал бы первым, но остальные - прекрасные инструменты, написанные отличными программистами.)
Если вы хотите, чтобы выполнялась только одна программа и никоим образом не беспокоить пользователя, то лучше всего использовать pam_exec(8)
модуль, который нельзя обойти, работает независимо от оболочки и обеспечивает легкую возможность запуска от имени пользователя или учетной записи пользователя программы, выполняющей авторизацию. На странице руководства приведен следующий пример:
Add the following line to /etc/pam.d/passwd to rebuild the
NIS database after each local password change:
passwd optional pam_exec.so seteuid make -C /var/yp
This will execute the command
make -C /var/yp
with effective user ID.
Это может быть расширено для работы на auth
, account
, password
, и session
действия; наверное session
лучше всего запускать при входе в систему. Просто добавьте строку вроде:
session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd
на ваш /etc/pam.d/sshd
контрольный файл.
В новых версиях OpenSSH есть серверная функция, которая называется ForceCommand который дает управление сценарию вместо операции (scp, ssh, ...), которую задумал пользователь. Сценарию передается исходная команда, так что вы, вероятно, сможете связать его после того, как сделаете все, что вам нужно.
Из sshd_config (5):
ForceCommand
Принудительно выполняет команду, указанную ForceCommand, игнорируя любую команду, предоставленную клиентом и ~ / .ssh / rc, если он присутствует. Команда вызывается с помощью оболочки входа пользователя с параметром -c. Это относится к выполнению оболочки, команды или подсистемы. Это наиболее полезно внутри блока Match. Команда, изначально предоставленная клиентом, доступна в переменной среды SSH_ORIGINAL_COMMAND. Указание команды `` internal-sftp '' приведет к принудительному использованию внутрипроцессного sftp-сервера, который не требует файлов поддержки при использовании с ChrootDirectory.
Я использовал это один раз, чтобы переопределить scp и обеспечить безопасную загрузку драгоценных камней, не давая каждому пользователю, уполномоченному загружать драгоценные камни, интерактивный доступ, который им не нужен или не нужен.
Один из способов - использовать syslog-ng в качестве демона системного журнала и настройте его для запуска сценария в фоновом режиме каждый раз, когда совпадает определенная запись журнала (например, успешный вход в систему ssh).
Проверь это:
Я не верю, что есть способ отключить это. Кто-нибудь еще может это проверить?