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ć.

sunside
źródło

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 ...

JanC
źródło
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
1

Wcześniej widziałem to pasujące zdarzenia w pliku dziennika (co zapewniłoby ci elastyczność w dopasowywaniu czegokolwiek). Ta strona jest źle sformatowana, ale może pomóc w rozpoczęciu korzystania: https://help.ubuntu.com/community/AudibleLogs#Play with esound

kanaka
źródło
Myślę, że ty / oni mają na myśli espeakzamiast esound?
JanC
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.

EEAA
źródło
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

higuita
źródło
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

Pesto
źródło