Zatrzymać logowanie ssh przed drukowaniem motd z klienta?

44

Mam skonfigurowane SSH bez hasła, jednak drukuje ono MoTD po zalogowaniu. Czy jest jakiś sposób, aby zatrzymać to po stronie klienta?

Próbowałem, ssh -qale to nie działa. Nie chcę używać ~/.hushloginani nie chcę zmieniać konfiguracji serwera. Jedyne, co może zadziałać, to wyciszenie wszystkich danych wyjściowych za pomocą >/dev/null 2>&1. Nie chcę jednak ignorować błędów w przypadku, gdy rzeczywiście występuje problem. Nawet robienie >/dev/nullnie działa, ponieważ sshwydaje się, że drukuje motd na stderr.

Aktualizacja i uzasadnienie Korzystam z kopii zapasowej w cronie. Nie chcę otrzymywać wiadomości e-mail z cronem, chyba że wystąpił błąd. Jeśli jednak motd zostanie wydrukowany, cały czas otrzymam wiadomość e-mail.

Chcę nadal drukować motd, ponieważ ma to konsekwencje prawne. Motd mówi „zabroniony jest dostęp bez uzasadnienia”. Musisz mieć tego rodzaju oświadczenie, aby prawnie uniemożliwić dostęp do niego (jak znak zakazu wstępu). Dlatego nie chcę cały czas go wyłączać.

Rory
źródło
1
Czy możesz dodać kilka szczegółów na temat pracy crona ...
Kyle Brandt,
1
Motd jest drukowany tylko dla sesji interaktywnych. Właśnie go przetestowałem i jest tak:> $ ssh host → MOTD wydrukowane> $ ssh host ls → drukuje tylko zawartość katalogu domowego Innymi słowy, robisz coś bardzo źle; próbowałeś?
niXar
Warto również zwrócić uwagę /etc/profile.dna ewentualne skrypty, które mogą tam działać i wydrukować dane wyjściowe do konsoli podczas logowania.
Dave
4
Czy naprawdę istnieje prawo, które mówi „zabroniony jest nieautoryzowany dostęp”? Myślałem, że DMCA sprawia, że ​​nielegalne jest łamanie jakiegokolwiek systemu elektronicznego ( bez względu na to, jak słabo chronione ), więc dopóki masz jakieś wymagania dotyczące hasła / klucza SSH, wygląda to na czysty wygląd okna.
Nick T

Odpowiedzi:

58

Nie jestem pewien, dlaczego masz awersję do robienia tego poprawnie - albo na serwerze a la

PrintMotd no
PrintLastLog no

i

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so

Lub dodając ~ / .hushlogin dla każdego użytkownika.

Wskazówka: w przypadku ~ / .hushlogin dodaj go do / etc / skel, aby nowe katalogi domowe użytkowników były tworzone z tym plikiem.

Aktualizacja:

Bez dodatkowych informacji na temat zadania tworzenia kopii zapasowej crona moją jedyną propozycją jest przekierowanie wyniku polecenia do pliku (lub pozwolenie, aby cron przechwycił go w wiadomości e-mail), a wyjście sesji ssh do / dev / null. Coś jak:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null

Lub

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null

Musiałbym trochę się rozerwać przy użyciu poleceń, ale to powinno zacząć.

jtimberman
źródło
3
Lubię „robić poprawnie”.
Benoit,
14
Nie chcę go usuwać z serwera, ponieważ ze względów prawnych muszę przechowywać tam powiadomienie o „zabronionym dostępie autoryzowanym”.
Rory,
3
Fwiw, powiadomienie nie zapobiega nieautoryzowanemu dostępowi, jedynie informuje ludzi, że możesz (i podejmie) odpowiednie działania prawne i może monitorować ich użycie, podobnie jak powiadomienie o nagraniu rozmowy telefonicznej.
jtimberman
Bardzo pomogłoby to również wklejenie używanego zadania cron.
jtimberman
3
.hushloginjest miłe
andrewtweber
16

Jeśli chcesz to dla poszczególnych użytkowników, po prostu zrób touch ~/.hushlogini wszystko gotowe z OpenSSH.

Aktualizacja : jak wskazano w innym miejscu, pam_motdmoże być skonfigurowany tak, aby nie korzystał z jednego użytkownika .hushlogin; sprawdzić /etc/login.defsza HUSHLOGIN_FILE. Może być skonfigurowany tak, aby wszyscy użytkownicy byli umieszczeni na liście /etc/hushloginslub podobnie.

towo
źródło
2
Próbowałem tego, ale to nie zadziałało. Jak zauważyli inni, motd może być wydrukowany z pam
Rory
11

@ Uwaga Wszystkie przykłady zakładają, że ustawiłeś zmienną connectionStringz czymś podobnym connectionString=user@server.

Jak doszedłem do rozwiązania

Używanie ssh -Tpowinno działać w przypadku prostych poleceń. Na przykład nie drukuje żadnych dodatkowych informacji:

ssh -T $connectionString "echo 'blah'"

Problem polega na tym, że próbujesz użyć tutaj doc do uruchomienia wielu poleceń. Na przykład - poniżej NIE zadziała - wyświetli echo wiadomości dnia (MoTD), a także może pokazać ci „standardowe: nie jest tty”.

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Aby obejść ten problem, musisz najpierw zapisać polecenia w zmiennej lokalnej i wysłać je na zdalny serwer.

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"

Ale to bałagan ...

Ostateczne rozwiązanie

Wykonaj funkcję uniwersalną (pamiętaj, że może ona przyjmować ciąg znaków lub HEREDOC jako polecenia).

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}

Przykłady

Użyj tego w ten sposób:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC

Lub tak:

silentSsh $connectionString "echo 'blah'"

Lub tak:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC

Lub nawet tak:

silentSsh $connectionString < getlines.sh
Nux
źródło
Chciałbym mieć więcej pochwał za to. Bardzo pomocny w zrozumieniu niektórych skryptów over-ssh, które musieliśmy zrobić.
csexton,
Fantastyczna odpowiedź !! Dziękuję Ci bardzo!!
Scottie H
10

Co powiesz na ten hack? ;-P

ssh -t user@machineName '/bin/bash'

Poniżej znajduje nie obowiązuje:

Przekazywanie -Tdo ssh w celu wyłączenia alokacji tty:

ssh -T machineName 'echo foo'
Kyle Brandt
źródło
3
ssh użytkownik @ maszyna 'twoje polecenie tutaj' i tak nie wyświetla motd (nie jest to powłoka interaktywna).
Marie Fischer,
Och dobrze, punkt ....
Kyle Brandt
ale co to znaczy „to nie jest interaktywna powłoka”, ponieważ próbowałem i potrafię uruchamiać komendy, których by mi brakowało-t
Ciasto piekarz 08.09.16
pamiętaj, że dodanie „-t” zmienia zachowanie (wyświetla się zgodnie z Twoimi ustawieniami TERM, dodaje znaki kontrolne w razie potrzeby itp.). Może zmienić wynik niektórych poleceń (na przykład może wprowadzić błędy w: ssh -t somehost "tar cf - niektóre pliki"> local.tar # NIE używaj tutaj -t ... szczególnie jeśli ssh hosta unixowego Windows jeden, ale w innych przypadkach może pojawić się wiele innych problemów). Zobacz wspaniałą odpowiedź na @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac
3

Jaki to system operacyjny? W niektórych systemach (np. Ubuntu) motd nie jest drukowany przez serwer ssh (PrintMotd w / etc / ssh / sshd_config), ale przez pam z pam_motd. W takim przypadku prawdopodobnie nie możesz kontrolować tego z poziomu klienta.

inne
źródło
nie możesz tego kontrolować w kliencie ssh, ale na pewno możesz po stronie klienta :) .. zobacz moją odpowiedź po szczegóły
drAlberT
Nie, zaproponowałeś całkiem interesujący / sprytny hack wokół drukowanego motda, a nie rozwiązanie, które powstrzymałoby go przed wydrukowaniem przez klienta, co było pytaniem.
theotherreceive
2

Musisz to zrobić na serwerze:

PrintMotd no
PrintLastLog no

Na debian / ubtuntu również haszuje linię z pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
ThorstenS
źródło
Nie ty nie. Zobacz odpowiedź Kyle'a Brandta poniżej.
Stobor,
-1 - Odpowiedź nie odzwierciedla edytowanego pytania. Już nieistotny.
romów,
2

Nie wykonuj polecenia ssh bezpośrednio przez crona.

Zamiast tego utwórz skrypt bash pomocnika , wykonując zadanie ssh i pobierając dane wyjściowe, błędy i kod błędu, jeśli to konieczne; ostatecznie przeanalizuj je, aby usunąć niechciane ciągi z komunikatów o błędach (w Twoim przypadku MoTD), a następnie ponownie wydrukuj dane wyjściowe skryptu bash i strumienie błędów, które uzyskałeś w taki sposób.

Następnie umieść ten skrypt bash w cron i żyj szczęśliwy :)

Uwaga: Jest to ogólne rozwiązanie i musi działać niezależnie od pracy, którą musisz wykonać za pośrednictwem ssh. To także tylko strona klienta, która powinna zaspokoić twoje potrzeby ... jedyną zależnością klienta od konfiguracji serwera jest znajomość dokładnej wiadomości, którą chcesz wyciąć ze standardowego błędu lub z klienta ssh

drAlberT
źródło
2
To nie jest rozwiązanie, które można obejść.
niXar
Przepraszam, nie mogę się z tobą zgodzić. IMHO właśnie tak powinno się robić wszystko czysto ... Zgodziłbym się z tobą, gdyby istniał sposób na jawne skonfigurowanie klienta ssh tak, aby ignorował motd, ale nie może istnieć tylko dlatego, że nie jest pod kontrolą sshd !
drAlberT
2

Po prostu sidenote (byłbym komentarzem, gdybym mógł to opublikować): Zawartość motd jest wyświetlana po udanym zalogowaniu do systemu. Jeśli chciałbym legalnie uniemożliwić ludziom dostęp do skrzynki, wolałbym to zrobić poprzez „Banner” w sshd_config. Zawartość jest wyświetlana po wprowadzeniu nazwy użytkownika, ale przed uwierzytelnieniem.


źródło
4
tak, ale możesz wyłączyć baner używając -q na kliencie ssh, więc nie mogę zgodzić się z twoją notatką
drAlberT
1
Och, chłopcze, całkowicie to widzę, „-q” pokonując całą obronę legalnego zespołu pracującego dla Dynacorp Inc. Kurwa! Nie widzieli, jak to nadchodzi. Zejdź na ziemię. Jeśli ktoś, kto powinien zobaczyć banner celowo go uchyla ... banner wciąż jest wiążący, ponieważ trzeba go znać, aby go uniknąć.
niXar
2

Albo nie próbowałeś tego, co opisujesz, albo twoje serwery są źle skonfigurowane!

Oto, co właśnie wypróbowałem na RHEL5:

workstation ~ $ ssh root@server
server ~ # echo "MOTD" > /etc/motd
server ~ # ^D
workstation ~ $ ssh root@server
MOTD
server ~ # ^D
workstation ~ $ ssh root@server echo notice the lack of motd
notice the lack of motd
workstation ~ $ 

Nie sądzę, że potrzebujesz przesłania wyłączenia odpowiedzialności do nieinteraktywnych powłok, prawda? (Jeśli ktoś twierdzi, że tak robisz, wyświadcz mi przysługę, skop je do szaleństwa). Ponieważ właśnie dlatego istnieje różnica między powłokami interaktywnymi i nieinteraktywnymi.

Ale w każdym razie oto, co robię, ponieważ nie lubię poczty od crona: przesyłam dane wyjściowe do programu rejestrującego. Po prostu przesuń go przez ogon, aby usunąć kilka pierwszych (powiedzmy 3) wierszy bezsensownego zrzeczenia się jako takiego (nieprzetestowany kod, nie mam dostępu do moich skryptów):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
niXar
źródło
Jeśli spojrzysz na man sshd, zobaczysz, że jest napisane: PROCES LOGOWANIA Gdy użytkownik pomyślnie się loguje, sshd wykonuje następujące czynności: 1. Jeśli logowanie jest na tty i nie podano żadnej komendy, drukuje czas ostatniego logowania i / etc / motd (chyba że jest to zabronione w pliku konfiguracyjnym lub ~ / .hushlogin; patrz sekcja PLIKI). 2. ... Zwróć uwagę, że jeśli polecenie zostanie wprowadzone do katalogu w ssh login, MOTD nie zostanie wyświetlone
katriel
Wiem, że to właśnie demonstrowałem. O co ci chodzi?
niXar
1

Jeśli cię rozumiem, potrzebujesz motd z innych powodów, ale nie potrzebujesz motd do tworzenia kopii zapasowych. W konfiguracji sshd nie można ustawić na podstawie użytkownika tylko globalnie. Dlatego musisz rozwiązać supresję motd po stronie klienta. Ale nie ma różnicy między tekstem motd a komunikatami o błędach oprogramowania do tworzenia kopii zapasowych. Oba są tekstem w terminalu. Jedyne rozwiązanie, które widzę, aby zrobić różnicę między tymi dwoma komunikatami, a następnie odfiltrować jeden komunikat motda. Ponieważ komunikaty oprogramowania są trudne do modyfikacji, sugeruję zmodyfikować tekst motd. Na przykład umieść ramkę wokół:

*** BEGIN message from the machine room ***

motd message

*** END message from the machine room ***

Następnie należy odfiltrować tekst między ramką i upuścić go.

Saabi
źródło
1

ROZWIĄZANIE TUTAJ:

Jeśli nie jesteś odpowiedzialny za serwer i nie możesz zmienić konfiguracji motd lub sshd, użyj polecenia w następujący sposób:

Przekieruj STDERR do STDOUT dla komend zdalnych, abyś je zobaczył. A następnie przekieruj STDERR ssh do / dev / null. MOTD przechodzi do STERR i kończy się w / dev / null. Zostanie wyświetlony dowolny standardowy komunikat o błędzie ORAZ ze zdalnego polecenia (w przypadku STDOUT)

Wariant 1 - jeśli zależy Ci na statusie wyjścia zdalnie wykonywanej komendy:

ssh remotehost "(remote_command1 && remote_command2; remote_command3) 2>&1" 2>/dev/null || echo SSH connection or remote command failed - either of them returned non-zero exit code $?

Wariant 2 - jeśli chcesz zignorować kod wyjścia komendy zdalnej - po prostu wykonaj true jako ostatnią komendę zdalną

ssh remotehost "(remote_command; true) 2>&1" 2>/dev/null || echo SSH connection failed

Przykłady komunikatów o błędach:

Przykład 1:

ssh remotehost " failed_ remote_command 2> & 1" 2> / dev / null || echo Połączenie SSH nie powiodło się lub komenda zdalna zwróciła niezerowy kod wyjścia
 bash: nieudana komenda zdalna
Połączenie SSH lub zdalne polecenie nie powiodło się - jedno z nich zwróciło niezerowy kod wyjścia 127

Przykład 2:

ssh remotehost " failed_ remote_command 2> & 1; true " 2> / dev / null || echo Połączenie SSH nie powiodło się
 bash: failed_remote_command: komenda nie została znaleziona

Przykład 3a:

ssh remotehost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo Połączenie SSH nie powiodło się
 # komunikat nie jest wyświetlany

Przykład 3b:

ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || echo Połączenie
 SSH nie powiodło się Połączenie SSH nie powiodło się
Chris
źródło
0

Czy próbowałeś usunąć tekst z pliku motd? Tylko myśl.

Hint: /etc/motd
Joseph Kern
źródło
4
Powiedział po stronie klienta, po stronie PrintMotd ustawienie na s w sshd_config prawdopodobnie byłoby lepsze
Kyle Brandt
0

Co próbujesz zrobić i dlaczego przeszkadza Ci MoTD? Zgaduję, że wykonuję polecenie zdalne i analizuję dane wyjściowe? Jeśli tak, można to zrobić na wiele sposobów bez wywoływania interaktywnej powłoki (co powoduje wyświetlenie motd).

Marie Fischer
źródło
Och, takie jak? Wolałbym raczej pomyśleć o ssh ..
Rory