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


12

Я хотів би, щоб мій сервер OpenSSH запускав скрипт щоразу, коли користувач входить у систему, використовуючи SSH, в ідеалі передаючи ім'я хоста або IP, а також ім'я користувача. Крім того, я хотів би, щоб він запускав сценарій, коли сеанс припиняється (передаючи ім'я користувача). Ці сценарії не повинні працювати у користувальницькому сеансі, а загальносистемні.

Ідея полягає у поданні звукового попередження про вхід та вихід, наприклад, за допомогою espeakта відображення інформації на зовнішньому дисплеї.

Я бачив, що є pam-scriptsпакет, але я не впевнений, чи це робить те, що я хочу, ні як ним користуватися.

Відповіді:


10

Ви можете примусити команду до своїх SSH-користувачів замість того, кого вони запитують (або їх оболонки, якщо вони не дають певної команди). Це можна зробити, вказавши цю команду з чимось на зразок ForceCommand /root/ssh-wrapperв /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

Тепер кожного разу, коли я входив або виходив, голос повідомляє мені про це, і запис журналу записується в syslog. Він також записує команду. Ви можете використовувати щось на зразок наведеного нижче, щоб "дотримуватися" використання свого sshd:

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

Зверніть увагу, що цей сценарій здебільшого не перевірений, тому використовуйте на свій страх і ризик! ;-)

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


Привіт, чи є спосіб виявити ситуацію, коли користувач просто закрив вікно ssh-клієнтом. Ваш сценарій не підключає цю ситуацію .. Дякую.
Дмитро Ескін

Якщо shellв $ {SSH_ORIGINAL_COMMENT: -shell} слід замінити фактичний шлях до оболонки, наприклад. / бін / баш? Коли я просто намагаюся запустити це, він скаржиться, що немає такої команди, як оболонка. Насправді, я думаю, можливо, те, що ти мав на увазі, це $ SHELL? Це має запускати вказану користувачем оболонку.
Ібрагім

1

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


Я думаю, що ви / вони означають espeakзамість esound?
січня

0

(Відповідь перекладено з того ж питання на ServerFault )

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

Крім того, іншим способом зробити це було б простий моніторинг демон /var/log/authдля нових (і закриття) сеансів ssh. Таким чином, він зможе надсилати сповіщення як на вхід, так і на вихід.


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будь-який інший процес, який відповідає вашим потребам (електронна пошта, надсилання електронної пошти тощо). Якщо ви користуєтесь 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 / email-notification-about-every-ssh-connection-to-linux-server

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.