SSH MOTD na użytkownika

17

Chcę wyświetlić baner (wiadomość powitalną) dla użytkowników SSH z konkretną wiadomością powitalną dla każdego użytkownika.

użytkownik260277
źródło

Odpowiedzi:

38

Nie określono, jakiego serwera SSH używasz. Zakładam OpenSSH.

Zauważ, że banner SSH i MOTD to dwie różne rzeczy.

Chociaż są prawie nie do odróżnienia w terminalu SSH, zachowują się inaczej, na przykład w kliencie SFTP.


MOTD to tylko tekst wydrukowany na interaktywnym terminalu. Nie będzie więc (i nie może) zostać wysłany do klientów SFTP, na przykład (więcej o tym później).

MOTD jest zakodowany na /etc/motdstałe w OpenSSH. Możesz włączyć / wyłączyć tylko globalnie, korzystając z PrintMotddyrektywy.

Jednak w niektórych systemach Linux PrintMotdopcja jest zawsze wyłączona, a plik MOTD jest drukowany przez stos PAM (za pomocą pam_motdmodułu). W takim przypadku możesz go wyłączyć za pomocą /etc/pam.d/sshdlub określić niestandardową motd=ścieżkę jako parametr modułu.


Sztandar SSH to specjalna funkcja SSH 2.0, wysyłana w określonym pakiecie SSH (SSH2_MSG_USERAUTH_BANNER).

W związku z tym nawet klienci nieterminalni, tacy jak klienci SFTP, mogą go przetwarzać i wyświetlać użytkownikowi. Zobacz na przykład, jak wyświetla się baner w kliencie WinSCP SFTP / SCP .

SSH baner jest konfigurowalny za użytkownika (lub grupy lub innych kryteriów) w sshd_configUżywanie Bannera Matchdyrektywami :

Match User username1
    Banner /etc/banner_user1

Match User username2
    Banner /etc/banner_user2

Zobacz także Wyłącz baner ssh dla określonych użytkowników lub ips .


Oczywiście możesz również użyć niestandardowej implementacji wiadomości / banera. Wystarczy wydrukować wiadomość wybraną za pomocą niestandardowej logiki ze skryptu profilu globalnego.

Podobnie jak w przypadku MOTD, nie zadziała to w przypadku sesji nieinteraktywnych (SFTP i podobnych).

Co ważniejsze, nie tylko to nie zadziała, musisz upewnić się, że wydrukujesz wiadomość tylko dla terminala interaktywnego. Co OpenSSH robi automatycznie dla /etc/motd. Użyj skryptu profilu globalnego, który działa tylko dla terminala interaktywnego, lub wydrukuj komunikat warunkowo na podstawie wartości TERMzmiennej środowiskowej.

Jeśli wydrukujesz wiadomość dla sesji nieinteraktywnej, zepsujesz dowolnego klienta, który używa ścisłego protokołu, takiego jak SFTP lub SCP, ponieważ klient spróbuje zinterpretować wiadomość tekstową jako wiadomość protokołu, co nie powiedzie się.

Zobacz na przykład opis takiego problemu w dokumentacji klienta WinSCP SFTP / SCP .

(Jestem autorem WinSCP)

Martin Prikryl
źródło
Cześć wszystkim, dziękuję za odpowiedź, mam rozwiązanie, proszę mnie poprawić, jeśli się mylę. Dołączam te linie do pliku / etc / profile. PGROUP = groups|awk '{print $1}'cat /etc/motd.${PGROUP} przed dodaniem tego wiersza tworzę plik banerowy dla każdego użytkownika w katalogu / etc. i plik jak motd.root i motd.alex i ta praca dla mnie.
user260277,
To też powinno wystarczyć. Z wyjątkiem mojej odpowiedzi działa to tylko w terminalu interaktywnym. Nie będzie działać dla SFTP i podobnych.
Martin Prikryl,
terminal interaktywny oznacza?
user260277,
Jest to terminal, z którym człowiek wchodzi w interakcję (w przeciwieństwie do sesji SFTP, sesji SCP lub nieinteraktywnego terminalu używanego do zdalnego wykonywania niektórych zadań wsadowych)
Martin Prikryl
Podałem kilka trudnych szczegółów na temat niestandardowej implementacji banera.
Martin Prikryl,
9

Możesz także użyć "$HOME/.ssh/rc"pliku do zarchiwizowania tego, co chcesz zrobić

echo "echo Hello World" > /home/pluto/.ssh/rc
ssh pluto@localhost
Last login: Thu Dec 18 08:46:16 2014 from localhost.localdomain
Hello World

Tak więc możesz mieć jeden ssh rc dla każdego użytkownika.

c4f4t0r
źródło
cześć, próbuję tego, ale wyświetla komunikat o błędzie .ssh / rc: 1: .ssh / rc: welcom: not found.
user260277,
to moja wina, zrobiłem literówkę, potrzebujesz echa jak w normalnym skrypcie bash
c4f4t0r
„Wolrd” to także literówka :)
simon
Dostaję „stty: standardowe wejście: niewłaściwy ioctl dla urządzenia”.
Wstrzymano do odwołania.
co masz w .ssh / rc?
c4f4t0r,