Запустить (системный) скрипт при входе и / или выходе из SSH

12

Я бы хотел, чтобы мой сервер OpenSSH запускал скрипт всякий раз, когда пользователь входит в систему, используя SSH, в идеале передавая имя хоста или IP, а также имя пользователя. Кроме того, я бы хотел, чтобы он запускал скрипт, когда сеанс завершается (передавая имя пользователя). Эти сценарии должны выполняться не во время сеанса пользователя, а во всей системе.

Идея состоит в том, чтобы сделать звуковое предупреждение при входе и выходе из системы, например, используя espeak, и отобразить информацию на внешнем дисплее.

Я видел, что есть pam-scriptsпакет, но я не уверен, что он делает то, что я хочу, и как его использовать.

Sunside
источник

Ответы:

10

Вы можете навязать команду своим SSH-пользователям вместо того, который они запрашивают (или их оболочке, если они не дают конкретной команды). Это можно сделать, указав для этой команды что-то вроде ForceCommand /root/ssh-wrapperin /etc/ssh/sshd_config(не имеет значения, где находится скрипт или как он называется, просто убедитесь, что он исполняется всеми пользователями, и файл конфигурации sshd указывает на него). Вам также необходимо перезагрузить / перезагрузить sshd. Исходная команда доступна для форсированной команды как $SSH_ORIGINAL_COMMAND.

Я только что взломал этот скрипт вместе:

#! /bin/sh

# add logger options when needed
log="logger -t ssh-wrapper"

# find IP address
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

$log $USER login from $ip
espeak "$USER just logged in from $ip" > /dev/null 2>&1

$log command: ${SSH_ORIGINAL_COMMAND:-shell}
${SSH_ORIGINAL_COMMAND:-shell}

$log $USER logout
espeak "$USER just logged out" > /dev/null 2>&1

Теперь каждый раз, когда я вхожу или выхожу из системы, мне сообщают об этом, и запись в журнал записывается в системный журнал. Это также регистрирует команду. Вы можете использовать что-то вроде следующего, чтобы «следовать» вашему использованию sshd:

tailf /var/log/syslog | grep ssh-wrapper

Обратите внимание, что этот скрипт в основном не тестировался, поэтому используйте его на свой страх и риск! ;-)

PS: помните, что этот скрипт запускается как пользователь, который вошел в систему, поэтому вы не можете делать все, что хотите, если вы измените его, чтобы добавить больше функций ...

Janc
источник
Привет, есть ли способ обнаружить ситуацию, когда пользователь просто закрыл окно с ssh-клиентом. Ваш сценарий не перехватывает эту ситуацию .. Спасибо.
Дмитрий Эскин
Должен ли shellв $ {SSH_ORIGINAL_COMMENT: -shell} быть заменен фактическим путем к оболочке, например. / бен / Баш? Когда я просто пытаюсь запустить это, он жалуется, что нет такой команды, как shell. На самом деле, я думаю, что вы имели в виду $ SHELL? Это должно запустить указанную пользователем оболочку.
Ибрагим
1

Я видел это совпадение событий в файле журнала раньше (что позволит вам гибко сопоставлять что угодно). Эта страница плохо отформатирована, но она может помочь вам начать: https://help.ubuntu.com/community/AudibleLogs#Play with esound

канак
источник
Я думаю, что вы / они имеют в виду, espeakа не esound?
JanC
0

(Ответьте перекрестно на один и тот же вопрос на ServerFault )

Просто напишите сценарий, чтобы делать все, что вы хотите, а затем вставьте его /etc/profileили, возможно, в /etc/bash.bashrcзависимости от ваших потребностей. Изменения в этих файлах будут применяться ко всем пользователям. Однако я не уверен, как вы будете уведомлять о выходе из системы при таком подходе.

В качестве альтернативы, другим способом сделать это было бы простое наблюдение /var/log/authза демонами для новых (и закрывающихся) сессий ssh. Таким образом, он сможет отправлять уведомления как при входе, так и при выходе.

EEAA
источник
0

Вы можете использовать sshrc (man sshd, поиск sshrc)

ssh выполнит / etc / ssh / sshrc, если он существует, и вы можете запустить один скрипт (или вызвать несколько скриптов) оттуда

Вы можете вызвать любую переменную bash, $USERполучить или получить IP через

read -d " " ip <<< $SSH_CONNECTION

Вы можете написать скрипт для тестирования или записать то, что вы хотите.

Сценарий выхода из системы ... ну, это то, что я ищу! : D

Игиты
источник
0

Я считаю PAM лучшим вариантом. Он общесистемный и не может быть переопределен конфигурационными файлами пользователя.

Вы можете следовать этим шагам. Они работали для меня на Ubuntu 14.04.4 LTS.

Бегать:

$ sudo pico /opt/custom/bin/info-session.sh

Отредактируйте этот пустой файл и добавьте следующие строки:

#!/bin/sh

[ "$PAM_TYPE" = "open_session" ] || exit 0

INFO=$(date +"%Y/%m/%d %T $PAM_USER ($PAM_RHOST) $PAM_SERVICE $PAM_TTY") # You can customize message.

echo "PAM access: $INFO" | write user > /dev/null 2>&1 # See Note 1.

exit 0

После этого дайте разрешение на выполнение скрипту:

$ sudo chmod ugo+x /opt/custom/bin/info-session.sh

Теперь запустите:

$ sudo pico /etc/pam.d/common-session

Добавьте эти строки в конец файла:

# Modified by user:
session optional pam_exec.so /opt/custom/bin/info-session.sh

Нет необходимости перезапускать какой-либо сервис. Обратите внимание, что этот сценарий также будет запускаться, когда пользователь входит в систему с терминала вместо SSH.

Примечание 1: Вы можете направить espeakили любой другой процесс, который соответствует вашим потребностям (электронная почта, push-уведомления и т. Д.). Если вы используете writeи пользователь вошел в систему, он или она увидит выходные сообщения непосредственно на своем терминале.

Ссылки:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -Логин пользователя/

Связанный:
Как настроить оповещение по электронной почте при успешном входе в систему через ssh?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / электронный-уведомление-о-каждый-SSH-подключения-к-Linux-сервер

Pestro
источник