Uruchom skrypt (systemowy) podczas logowania i / lub wylogowywania SSH


12

Chciałbym, aby mój serwer OpenSSH uruchamiał skrypt za każdym razem, gdy użytkownik loguje się za pomocą SSH, najlepiej przekazując nazwę hosta lub adres IP, a także nazwę użytkownika. Dodatkowo chciałbym, aby uruchamiał skrypt za każdym razem, gdy sesja zostanie zakończona (przekazanie nazwy użytkownika). Te skrypty nie powinny być uruchamiane w sesji użytkownika, ale w całym systemie.

Chodzi o to, aby dać dźwiękowe ostrzeżenie przy logowaniu i wylogowaniu, np. Za pomocą espeaki wyświetlić informacje na zewnętrznym wyświetlaczu.

Widziałem, że istnieje pam-scriptspakiet, ale nie jestem pewien, czy to robi to, co chcę, ani jak go używać.

Odpowiedzi:


10

Możesz wymusić polecenie dla użytkowników SSH zamiast tego, którego żądają (lub powłoki, jeśli nie wydadzą określonego polecenia). Można to zrobić poprzez określenie tego polecenia z czymś ForceCommand /root/ssh-wrapperw /etc/ssh/sshd_config(nie ma znaczenia, gdzie znajduje się skrypt, lub jak to nazywa, po prostu upewnij się, że jest wykonywalny przez wszystkich użytkowników i punktów plików konfiguracja sshd do niego). Musisz także ponownie uruchomić / ponownie załadować sshd. Oryginalny komenda jest dostępna dla wymuszonym polecenia jako $SSH_ORIGINAL_COMMAND.

Właśnie zhakowałem ten skrypt razem:

#! /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

Teraz za każdym razem, gdy się loguję lub wylogowuję, głos mówi mi o tym, a wpis dziennika jest zapisywany w syslog. Rejestruje także polecenie. Możesz użyć czegoś takiego jak poniżej, aby „śledzić” użycie sshd:

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

Pamiętaj, że ten skrypt jest w większości nieprzetestowany, więc używaj go na własne ryzyko! ;-)

PS: pamiętaj, że ten skrypt jest uruchamiany jako zalogowany użytkownik, więc nie możesz zrobić wszystkiego, co chcesz, jeśli zmienisz go, aby dodać więcej funkcji ...


Cześć, Czy jest jakiś sposób na wykrycie sytuacji, gdy użytkownik właśnie zamknął okno za pomocą klienta ssh. Twój skrypt nie rozwiązuje tej sytuacji. Dzięki.
Dmitry Eskin

Należy shellw $ {SSH_ORIGINAL_COMMENT: -shell} zastąpić rzeczywistą ścieżką do powłoki, np. / bin / bash? Kiedy próbuję to uruchomić, narzeka, że ​​nie ma takiego polecenia jak shell. Właściwie to chyba miałeś na myśli SHELL? To powinno uruchomić powłokę określoną przez użytkownika.
Ibrahim


0

(Odpowiedź wysłana z tego samego pytania na ServerFault )

Po prostu napisz skrypt, aby zrobić, co chcesz, a następnie wklej go /etc/profilelub ewentualnie w /etc/bash.bashrczależności od potrzeb. Zmiany tych plików będą miały zastosowanie do wszystkich użytkowników. Jednak nie jestem pewien, jak byś poszedł w kwestii powiadamiania przy wylogowaniu przy takim podejściu.

Alternatywnie, innym sposobem na to byłoby posiadanie prostego monitorowania demona /var/log/authdla nowych (i zamykających) sesji ssh. W ten sposób będzie mógł wysyłać powiadomienia zarówno przy logowaniu, jak i wylogowaniu.


0

Możesz użyć sshrc (man sshd, wyszukaj sshrc)

ssh wykona / etc / ssh / sshrc, jeśli istnieje i możesz uruchomić jeden skrypt (lub wywołać wiele skryptów)

możesz wywołać dowolną zmienną bash, jak $USERlub uzyskać adres IP przez

read -d " " ip <<< $SSH_CONNECTION

możesz napisać skrypt, aby przetestować lub zalogować, co tylko chcesz.

Skrypt wylogowania ... cóż, właśnie tego szukam! :RE


0

Myślę, że PAM jest najlepszą opcją. Jest to system i nie można go zastąpić plikami konfiguracyjnymi użytkownika.

Możesz wykonać następujące kroki. Pracowali dla mnie na Ubuntu 14.04.4 LTS.

Biegać:

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

Edytuj ten pusty plik i dodaj następujące wiersze:

#!/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

Następnie udziel uprawnienia do wykonywania skryptu:

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

Teraz uruchom:

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

Dodaj następujące wiersze na końcu pliku:

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

Nie ma potrzeby restartowania żadnej usługi. Należy pamiętać, że ten skrypt będzie również uruchamiany, gdy użytkownik zaloguje się z terminala zamiast SSH.

Uwaga 1: Możesz espeakprzesyłać strumieniowo do dowolnego innego procesu, który odpowiada Twoim potrzebom (e-mail, powiadomienia push itd.). Jeśli używasz, writea użytkownik jest zalogowany, zobaczy on komunikaty wyjściowe bezpośrednio na swoim terminalu.

Odnośniki:
https://blog.stalkr.net/2010/11/login-notifications-pamexec-scripting.html
https://blog.redbranch.net/2014/06/04/pam_exec-so-execute-commands-on -login użytkownika/

Powiązane:
Jak skonfigurować powiadomienie e-mail, gdy logowanie do ssh zakończy się pomyślnie?
/server/400613/how-can-i-configure-my-server-to-notify-me-whenever-it-is-remotely-accessed-via
/server//questions / 395393 / email-powiadomienie-o-każdym-ssh-połączenie-z-serwerem linux

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.