Stoppen Sie die ssh-Anmeldung, um motd vom Client zu drucken?

44

Ich habe SSH passwortlos eingerichtet, aber es druckt das MoTD, wenn es sich anmeldet. Gibt es trotzdem eine Möglichkeit, dies vom Client aus zu verhindern?

Ich habe es versucht, ssh -qaber das funktioniert nicht. Ich möchte ~/.hushloginden Server nicht verwenden oder ändern. Das einzige, was funktionieren kann, ist, die gesamte Ausgabe mit leiser zu machen >/dev/null 2>&1. Ich möchte jedoch keine Fehler ignorieren, falls tatsächlich ein Problem vorliegt. Selbst das >/dev/nullgeht nicht, da sshdas Motiv anscheinend auf die stderr gedruckt wird.

Update & Argumentation Ich führe ein Backup in einem Cron durch. Ich möchte keine Cron-E-Mail erhalten, es sei denn, ein Fehler ist aufgetreten. Wenn das Motiv gedruckt wird, erhalte ich jedoch die ganze Zeit eine E-Mail.

Ich möchte, dass das Motiv weiterhin gedruckt wird, da dies rechtliche Auswirkungen hat. Das motd sagt "unathorized Zugang verboten". Sie müssen diese Art von Erklärung enthalten, um den Zugriff von Personen zu verhindern (wie ein Verbotsschild). Daher möchte ich es nicht die ganze Zeit pauschal deaktivieren.

Rory
quelle
1
Können Sie einige Details über den Cron Job hinzufügen ...
Kyle Brandt
1
Das Motiv wird nur für interaktive Sitzungen gedruckt. Ich habe es gerade getestet und es ist so:> $ ssh host → MOTD gedruckt> $ ssh host ls → druckt nur den Inhalt des Home-Verzeichnisses Mit anderen Worten, Sie machen etwas sehr Falsches; hast du es mal versucht
niXar
Es ist auch erwähnenswert, nach /etc/profile.dSkripten zu suchen, die dort ausgeführt werden, und beim Anmelden eine Ausgabe an die Konsole zu drucken.
Dave
4
Gibt es wirklich ein Gesetz, nach dem Sie "unberechtigter Zugriff verboten" sagen müssen? Ich dachte, das DMCA macht es illegal, irgendeine Art von elektronischem System zu beschädigen ( egal wie schlecht es geschützt ist ). Solange Sie eine Art Passwort- / SSH-Schlüssel-Anforderung haben, scheint dies eine reine Fensterdekoration zu sein.
Nick T

Antworten:

58

Ich bin mir nicht sicher, warum Sie eine Abneigung dagegen haben, dies richtig zu tun - entweder auf dem Server a la

PrintMotd no
PrintLastLog no

und

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

Oder ~ / .hushlogin für jeden Benutzer hinzufügen.

Fügen Sie es für ~ / .hushlogin zu / etc / skel hinzu, damit mit der Datei neue Benutzerverzeichnisse erstellt werden.

Aktualisieren:

Ohne weitere Informationen zu Ihrem Sicherungs-Cron-Job ist mein einziger anderer Vorschlag, die Ausgabe des Befehls in eine Datei umzuleiten (oder von Cron in E-Mails erfassen zu lassen) und die Ausgabe der SSH-Sitzung nach / dev / null. So etwas wie:

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

Oder

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

Ich würde ein bisschen mit den Befehlen herumspielen müssen, aber das sollte Ihnen den Einstieg erleichtern.

jtimberman
quelle
3
Ich mag das "richtig machen".
Benoit
14
Ich möchte es nicht vom Server entfernen, da ich dort aus rechtlichen Gründen eine Benachrichtigung über das Verbot des autorisierten Zugriffs aufbewahren muss.
Rory
3
Fwiw, die Benachrichtigung verhindert nicht den unbefugten Zugriff, sondern informiert lediglich die Personen darüber, dass Sie geeignete rechtliche Schritte einleiten können (und dies auch tun werden), und überwacht möglicherweise deren Verwendung, genau wie Benachrichtigungen über das Aufzeichnen eines Telefongesprächs.
Jtimberman
Außerdem wäre es sehr hilfreich, wenn Sie den von Ihnen verwendeten Cron-Job einfügen würden.
Jtimberman
3
.hushloginis nice
andrewtweber
16

Wenn Sie dies auf Benutzerbasis möchten, führen Sie einfach eine aus touch ~/.hushloginund Sie sind mit OpenSSH fertig.

Update : Wie an anderer Stelle erwähnt, pam_motdkann so konfiguriert werden, dass kein Benutzer verwendet wird .hushlogin. Check /etc/login.defsfür HUSHLOGIN_FILE. Es kann so konfiguriert werden, dass alle Benutzer in /etc/hushloginsoder ähnlich aufgeführt sind.

towo
quelle
2
Ich habe es versucht, aber es hat nicht funktioniert. Wie andere angemerkt haben, könnte das Motiv von Pam
Rory
11

@note Bei allen Beispielen wird davon ausgegangen, dass Sie eine Variable connectionStringmit so etwas wie festgelegt haben connectionString=user@server.

Wie ich zur Lösung kam

Verwenden ssh -Tsollte für einfache Befehle funktionieren. Dies gibt beispielsweise keine zusätzlichen Informationen aus:

ssh -T $connectionString "echo 'blah'"

Das Problem ist, wenn Sie versuchen, mit here-doc viele Befehle auszuführen. Zum Beispiel - unten wird NICHT funktionieren - es wird die Nachricht des Tages (MoTD) wiedergeben und es könnte auch angezeigt werden "stdin: is not a tty".

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

Um dieses Problem zu umgehen, müssen Sie zuerst die Befehle in der lokalen Variablen speichern und an den Remote-Server senden.

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

Aber das ist chaotisch ...

Endgültige Lösung

Erstellen Sie eine universelle Funktion (beachten Sie, dass als Befehle ein String oder HEREDOC verwendet werden kann).

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

Beispiele

Verwenden Sie dies wie folgt:

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

Oder wie folgt:

silentSsh $connectionString "echo 'blah'"

Oder wie folgt:

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

Oder auch so:

silentSsh $connectionString < getlines.sh
Nux
quelle
Ich wünschte, ich hätte mehr Gegenstimmen dafür. Sehr hilfreich, um etwas über-ssh-scripting herauszufinden, das wir machen mussten.
Csexton
Fantastische Antwort !! Vielen Dank!!
Scottie H
10

Wie wäre es mit diesem Hack? ;-P

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

Folgendes ist nicht gültig:

Übergabe -Tan ssh, um die Zuweisung von tty zu deaktivieren:

ssh -T machineName 'echo foo'
Kyle Brandt
quelle
3
ssh user @ machine 'your command here' zeigt das motd sowieso nicht an (es ist keine interaktive Shell).
Marie Fischer
Oh gut, Punkt ...
Kyle Brandt
aber was es bedeutet "es ist keine interaktive Shell", da ich versucht habe und Befehle ausführen kann, was mir fehlen würde-t
Ciasto piekarz
Bitte beachten Sie, dass das Hinzufügen von "-t" das Verhalten ändert (es wird gemäß Ihren TERM-Einstellungen angezeigt, fügt bei Bedarf Steuerzeichen hinzu usw.). Es kann das Ergebnis einiger Befehle ändern (es könnte zum Beispiel Fehler einbringen in: ssh -t irgendwo "tar cf - some files"> local.tar ein Windows ein, aber viele andere Probleme können in anderen Fällen auftreten). Siehe die wunderbare Antwort von @StephaneChazelas: unix.stackexchange.com/questions/151916/…
Olivier Dulac
3

Welches Betriebssystem ist das? Auf einigen Systemen (wie Ubuntu) wird die Motd nicht vom SSH-Server (PrintMotd in / etc / ssh / sshd_config) gedruckt, sondern von pam mit pam_motd. Wenn dies der Fall ist, können Sie es wahrscheinlich nicht vom Client aus steuern.

theotherreceive
quelle
Sie können es nicht im SSH-Client steuern, aber Sie können sicher auf der Client-Seite :) .. siehe meine Antwort für Details
drAlberT
Nein, Sie haben einen ziemlich interessanten / cleveren Hack für das zu druckende Motiv vorgeschlagen, und keine Lösung, um zu verhindern, dass es vom Kunden gedruckt wird, was die Frage war.
theotherreceive
2

Du musst es auf dem Server machen:

PrintMotd no
PrintLastLog no

Auf debian / ubtuntu hat auch die Zeile mit pam_motd.so:

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
ThorstenS
quelle
Nein, tust du nicht. Siehe Kyle Brandts Antwort unten.
Stobor
-1 - Die Antwort entspricht nicht der bearbeiteten Frage. Nicht mehr relevant.
Romandas
2

Führen Sie den Befehl ssh nicht direkt von cron aus.

Erstellen Sie stattdessen ein Hilfsbash-Skript , führen Sie den ssh-Job aus und rufen Sie bei Bedarf die Ausgabe, die Fehler und den Fehlercode ab. Analysieren Sie sie schließlich, um unerwünschte Zeichenfolgen aus Fehlermeldungen zu entfernen (in Ihrem Fall das MoTD) und drucken Sie die Bash-Skript-Ausgabe und die so erhaltenen Fehlerströme erneut aus.

Dann lege dieses Bash-Skript in cron und lebe glücklich :)

Hinweis: Dies ist eine allgemeine Lösung und muss funktionieren, was auch immer der Job ist, den Sie über ssh ausführen müssen. Es ist auch nur die Client-Seite, die Ihre Anforderungen erfüllen sollte ... Die einzige Abhängigkeit des Clients von der Serverkonfiguration besteht in der Kenntnis der genauen Nachricht, die Sie aus dem Standardfehler oder aus dem SSH-Client herausschneiden möchten

drAlberT
quelle
2
Das ist keine Lösung, die Abhilfe schafft.
nixar
Ich kann dir leider nicht zustimmen. IMHO ist es so, wie die Dinge sauber gemacht werden sollten ... Ich habe mit Ihnen abgestimmt, ob es eine Möglichkeit gibt, den ssh-Client explizit so zu konfigurieren, dass er die motd ignoriert, aber sie kann nicht existieren, einfach weil sie nicht unter der Kontrolle von sshd steht !
DRALBERT
2

Nur eine Randnotiz (wäre ein Kommentar gewesen, wenn ich das posten könnte): Der Inhalt von motd wird nach erfolgreicher Anmeldung im System angezeigt . Wenn ich legal verhindern möchte, dass Leute auf eine Box zugreifen, mache ich das lieber mit einem "Banner" in sshd_config. Der Inhalt wird nach Eingabe des Benutzernamens, aber vor der Authentifizierung angezeigt.


quelle
4
Ja, aber Sie können das Banner mit -q auf dem SSH-Client deaktivieren, sodass ich Ihrer Notiz nicht zustimmen kann
drAlberT
1
Oh Mann, ich kann es total sehen, "-q", das die gesamte Verteidigung des Crack-Legal-Teams besiegt, das für Dynacorp Inc. arbeitet. Verdammt! Sie hatten es nicht kommen sehen. Werde real. Wenn jemand, der das Banner sehen soll, es absichtlich meidet, ist das Banner immer noch bindend, da man es wissen musste, um es zu meiden.
NiXar
2

Entweder haben Sie nicht versucht, was Sie beschreiben, oder Ihre Server sind falsch konfiguriert!

Folgendes habe ich gerade auf RHEL5 ausprobiert:

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 ~ $ 

Ich nehme nicht an, dass Sie den Haftungsausschluss für nicht interaktive Shells benötigen, oder? (Wenn jemand behauptet, dass Sie das tun, tun Sie mir einen Gefallen, und treten Sie ihn in die Nüsse.) Genau aus diesem Grund wird zwischen interaktiven und nicht interaktiven Shells unterschieden.

Aber auf jeden Fall mache ich Folgendes, weil ich keine E-Mails von cron mag: Ich leite die Ausgabe an logger weiter. Leiten Sie es einfach durch den Schwanz, um die ersten paar (sagen wir 3) Zeilen Ihres sinnlosen Haftungsausschlusses als solchen zu entfernen (ungetesteter Code, ich habe keinen Zugriff auf meine Skripte):

( tail -n +3 | logger -i -t mycronjob -s -p cron.crit ) <&6 &
exec 2>&6
cron_fsckin_job
niXar
quelle
Wenn Sie in man sshd nachschauen, sehen Sie, dass dort steht: LOGIN PROCESS Wenn sich ein Benutzer erfolgreich anmeldet, führt sshd Folgendes aus: 1. Wenn sich die Anmeldung auf einem tty befindet und kein Befehl angegeben wurde, wird die letzte Anmeldezeit gedruckt und / etc / motd (sofern nicht in der Konfigurationsdatei oder durch ~ / .hushlogin verhindert; siehe Abschnitt DATEIEN). 2. ... Beachten Sie, dass bei Eingabe eines Befehls im Verzeichnis ssh login keine MOTD angezeigt wird
katriel
Ich weiß, das habe ich demonstriert. Worauf willst du hinaus?
niXar
1

Wenn ich Sie verstehe, brauchen Sie motd aus anderen Gründen, aber nicht für das Backup. In der Konfiguration von sshd kann man es nicht benutzerbezogen nur global einrichten. Daher müssen Sie die Motd-Unterdrückung auf der Client-Seite lösen. Es besteht jedoch kein Unterschied zwischen dem Text von motd und den Fehlermeldungen der Sicherungssoftware. Beides ist Text im Terminal. Die einzige Lösung, die ich sehe, um einen Unterschied zwischen diesen beiden Meldungen zu machen, ist das Filtern der Motd-Meldung. Da die Meldungen der Software schwer zu ändern sind, schlage ich vor, den Text von motd zu ändern. Zum Beispiel setzen Sie einen Rahmen um:

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

motd message

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

Dann sollten Sie den Text zwischen den Rahmen herausfiltern und ablegen.

Saabi
quelle
1

LÖSUNG HIER:

Wenn Sie nicht für den Server verantwortlich sind und die Konfiguration von motd oder sshd nicht ändern können, verwenden Sie den folgenden Befehl:

Leiten Sie STDERR für Remote-Befehle zu STDOUT um, damit Sie es sehen. Und dann leiten Sie STDERR von ssh nach / dev / null um. MOTD geht zu STERR und landet in / dev / null. Jede Standard-UND-Fehlermeldung vom Remote-Befehl wird angezeigt (wie es zu STDOUT geht)

Variante 1 - Wenn Sie sich für den Exit-Status des remote ausgeführten Befehls interessieren:

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 $?

Variante 2 - Wenn Sie den Exit-Code des Remote-Befehls ignorieren möchten, führen Sie einfach true als letzten Remote-Befehl aus

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

Beispiele für Fehlermeldungen:

Beispiel 1:

ssh remotehost " failed_ remote_command 2> & 1" 2> / dev / null || echo SSH-Verbindung fehlgeschlagen oder Remote-Befehl hat einen Exit-Code ungleich Null zurückgegeben.
 bash: failed_remote_command: Befehl nicht gefunden
SSH-Verbindung oder Remote-Befehl fehlgeschlagen - einer von beiden hat den Exit-Code 127 ungleich Null zurückgegeben

Beispiel 2:

ssh remotehost " failed_ remote_command 2> & 1; true " 2> / dev / null || Echo SSH-Verbindung fehlgeschlagen
 Bash: fehlgeschlagener_Fernbefehl: Befehl nicht gefunden

Beispiel 3a:

ssh remotehost " failed_ remote_command 2> & 1; true" 2> / dev / null || Echo-SSH-Verbindung fehlgeschlagen
 # Es wird keine Nachricht angezeigt

Beispiel 3b:

ssh nonexistinghost " failed_ remote_command 2> & 1; true" 2> / dev / null || Echo SSH-Verbindung fehlgeschlagen
 SSH-Verbindung fehlgeschlagen
Chris
quelle
0

Haben Sie versucht, den Text in der Motd-Datei zu entfernen? Nur ein Gedanke.

Hint: /etc/motd
Joseph Kern
quelle
4
Er sagte von der Client-Seite, von der Server-Seite aus wäre es wahrscheinlich besser, PrintMotd in sshd_config auf no zu setzen
Kyle Brandt
0

Was versuchst du zu tun und warum stört dich das MoTD? Ich vermute, einen Remote-Befehl auszuführen und die Ausgabe zu analysieren? In diesem Fall kann dies auf verschiedene Arten erfolgen, ohne dass eine interaktive Shell aufgerufen wird (wodurch das Motiv angezeigt wird).

Marie Fischer
quelle
Oh wie? Ich würde wirklich lieber SSH-Gedanken verwenden ..
Rory