Frage Stoppen Sie die SSH-Anmeldung beim Drucken von motd vom Client?


Ich habe SSH Passwordless eingerichtet, aber es druckt die MoTD, wenn es sich anmeldet. Gibt es auf jeden Fall, um das von der Client-Seite zu stoppen?

ich habe es versucht ssh -q aber das funktioniert nicht. Ich möchte nicht verwenden ~/.hushlogin noch möchte ich den Server-Setup ändern. Das einzige, was funktionieren kann, ist, alle Ausgaben mit zu beruhigen >/dev/null 2>&1. Ich möchte jedoch Fehler nicht ignorieren, falls tatsächlich ein Problem auftritt. Selbst machen >/dev/null funktioniert nicht, seit ssh scheint das motd zum stderr zu drucken.

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

Ich möchte das Wort gedruckt halten, weil das rechtliche Konsequenzen hat. Das Motd sagt "unberechtigter Zugang verboten". Sie müssen diese Art von Aussage darin haben, um Leute daran zu hindern, darauf zuzugreifen (wie ein unbefugtes Zeichen). Daher möchte ich nicht die ganze Zeit über alles deaktivieren.


39
2017-07-06 15:22


Ursprung


Kannst du ein paar Details zum Cron-Job hinzufügen? - Kyle Brandt♦
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, du machst etwas sehr falsches; Hast du es sogar versucht? - niXar
Es lohnt sich auch, einzuchecken /etc/profile.d für alle Skripte, die dort ausgeführt werden können und einige Ausgaben bei der Anmeldung auf der Konsole ausgeben. - Dave
Gibt es wirklich ein Gesetz, das verlangt, dass Sie sagen, dass "unerlaubter Zugang verboten" ist? Ich dachte, der DMCA mache es illegal, irgendein elektronisches System zu brechen (egal wie schlecht geschützt ist), so lange wie Sie eine Art Passwort / SSH-Schlüssel-Anforderung haben, scheint dies wie reine Schaufensterdekoration. - Nick T


Antworten:


Ich bin nicht sicher, warum Sie eine Abneigung 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 fügen Sie ~ / .hushlogin für jeden Benutzer hinzu.

Tipp, für ~ / .hushlogin, fügen Sie es zu / etc / skel hinzu, so dass neue Benutzer-Home-Verzeichnisse mit der Datei erstellt werden.

Aktualisieren:

Ohne weitere Informationen über Ihren Backup-Cron-Job ist mein einziger anderer Vorschlag, die Ausgabe des Befehls in eine Datei umzuleiten (oder Cron in E-Mail einzufangen) 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 müsste mit den Befehlen ein bisschen herumspielen, aber das sollte dich beginnen.


51
2017-07-09 08:56



Ich mag das "richtig machen". - Benoit
Ich möchte es nicht vom Server entfernen, da ich dort aus rechtlichen Gründen einen Hinweis "autorisierter Zugriff verboten" aufbewahren muss. - Rory
Fwiw, die Benachrichtigung verhindert keinen unbefugten Zugriff, sie benachrichtigt lediglich die Benutzer, dass Sie geeignete rechtliche Schritte einleiten können (und werden) und überwacht deren Verwendung, genau wie die Benachrichtigung über die Aufzeichnung eines Telefongesprächs. - jtimberman
Außerdem würde es sehr hilfreich sein, wenn Sie den Cron-Job einfügen, den Sie verwenden. - jtimberman
.hushlogin ist schön - andrewtweber


Wenn Sie dies pro Benutzer wünschen, tun Sie einfach a touch ~/.hushlogin und du bist mit OpenSSH eingestellt.

Aktualisieren: Wie anderswo erwähnt, pam_motd kann so konfiguriert werden, dass kein Benutzer verwendet wird .hushlogin; prüfen /etc/login.defs zum HUSHLOGIN_FILE. Es kann so konfiguriert werden, dass alle Benutzer aufgelistet sind /etc/hushlogins oder ähnliches.


14
2017-07-06 19:45



Ich habe das versucht, aber es hat nicht funktioniert. Wie andere darauf hingewiesen haben, könnte das Wort von Pam gedruckt werden - Rory


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

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

Das Folgende ist nicht gültig:

Vorbeigehen -T zu ssh tty Zuordnung zu deaktivieren:

ssh -T machineName 'echo foo'

9
2017-07-06 15:30



ssh user @ machine 'Ihr Befehl hier' zeigt das Motd trotzdem 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 ich vermisse -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 einführen in: ssh -t somehost "tar cf - einige Dateien"> local.tar # Benutze -t hier NICHT ... vor allem wenn du einen Unix-Host von ssh kommst ein Windows-1, aber viele andere Probleme können in anderen Fällen auftreten). Sehen Sie sich die wundervolle @ StephaneChazelas Antwort an: unix.stackexchange.com/questions/151916/... - Olivier Dulac


@note Alle Beispiele gehen davon aus, dass Sie eine Variable festgelegt haben connectionString mit etwas wie connectionString=user@server.

Verwenden ssh -T sollte für einfache Befehle funktionieren. Beispielsweise werden keine zusätzlichen Informationen gedruckt:

ssh -T $connectionString "echo 'blah'"

Das Problem ist, wenn Sie versuchen, here-doc zu verwenden, um viele Befehle auszuführen. Zum Beispiel - Balg wird nicht funktionieren - es wird Nachricht des Tages (MoTD) Echo und auch zeigen Ihnen "Stand: ist nicht ein tty".

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

Um das Problem zu umgehen, müssen Sie zunächst Befehle an die lokale Variable speichern und sie 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

Machen Sie eine universelle Funktion (beachten Sie, dass es eine Zeichenfolge oder HEREDOC als Befehle annehmen kann).

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

Beispiele

Benutze das so:

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

Oder so:

silentSsh $connectionString "echo 'blah'"

Oder so:

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

Oder sogar so:

silentSsh $connectionString < getlines.sh

6
2018-03-17 17:10



Ich wünschte, ich hätte mehr Upvotes dafür. Sehr hilfreich bei der Suche nach etwas über-ssh-Scripting, das wir tun mussten. - csexton


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


3
2017-07-06 15:33



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


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

Hier ist, was ich gerade an RHEL5 versucht habe:

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 Disclaimer an nicht-interaktive Shells schicken müssen, oder? (Wenn jemand behauptet, dass du es tust, tu mir einen Gefallen, triff sie in die Nüsse.) Das ist genau der Grund, warum man zwischen interaktiven und nicht-interaktiven Shells unterscheidet.

Aber auf jeden Fall, hier ist, was ich tue, weil ich keine Mail von Cron mag: Ich pipe die Ausgabe zu Logger. Führen Sie es einfach durch den Schwanz, um die ersten paar (sagen wir 3) Zeilen Ihres sinnlosen Haftungsausschlusses als solchen zu entfernen (ungeprüfter 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

3
2017-08-09 02:42



Wenn Sie in man sshd nachsehen, sehen Sie Folgendes: 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 FILES). 2. ... Beachten Sie, dass kein MOTD angezeigt wird, wenn ein Befehl in das Verzeichnis ssh eingegeben wird - katriel
Ich weiß, das habe ich demonstriert. Worauf willst du hinaus? - niXar


Sie müssen es auf dem Server tun:

PrintMotd no
PrintLastLog no

Auf debian / ubtuntu hasse 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

2
2017-07-06 18:10



Nein, tust du nicht. Siehe Kyle Brandts Antwort unten. - Stobor
-1 - Antwort spiegelt keine bearbeitete Frage wider. Nicht mehr relevant. - romandas


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

Machen Sie ein Helfer-Bash-Skript Stattdessen wird der ssh-Job ausgeführt und die Ausgabe, die Fehler und der Fehlercode bei Bedarf abgerufen. eventuell parse sie, um unerwünschte strings aus fehlermeldungen zu entfernen (die MoTD in ihrem fall) und dann auf bash script output und error stream was du auf diese weise erhalten hast.

Dann setze 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 Client-Seite, die Ihre Bedürfnisse erfüllen sollte ... die einzige Abhängigkeit des Clients von der Server-Konfiguration ist die Kenntnis der genauen Nachricht, die Sie aus dem STD-Fehler oder aus dem SSH-Client herausschneiden wollen


2
2017-08-06 09:04



Das ist keine Lösung, die eine Problemumgehung darstellt. - niXar
Ich kann dir nicht zustimmen, tut mir leid. IMHO, das ist die Art, wie Dinge sauber gemacht werden sollten ... Ich war mit Ihnen einverstanden, wenn es eine Möglichkeit gab, den ssh-Client explizit zu konfigurieren, um den motd zu ignorieren, aber er kann nicht existieren, einfach weil er nicht unter dem sshd-Steuerelement steht ! - drAlberT


Nur eine Nebenbemerkung (wäre ein Kommentar gewesen, wenn ich das posten könnte): Inhalte von motd werden gezeigt nach dem Erfolgreiche Anmeldung am System. Wenn ich Personen legal davon abhalten möchte, auf eine Box zuzugreifen, mache ich das lieber mit einem "Banner" in sshd_config. Der Inhalt wird nach der Eingabe des Benutzernamens, aber vor der Authentifizierung angezeigt.


2
2017-08-06 19:01



Ja, aber Sie können das Banner mithilfe von -q auf dem ssh-Client deaktivieren, sodass ich Ihrer Notiz nicht zustimmen kann - drAlberT
Oh Junge, ich kann es total sehen, "-q" besiegt die gesamte Verteidigung des Crack-Legal-Teams, das für Dynacorp Inc. arbeitet. Sie hatten es nicht kommen sehen. Realisiere dich. Wenn jemand, der das Banner sehen soll, sich ihm bewusst entzieht ... das Banner ist immer noch bindend, da du es wissen musst, um es zu umgehen. - niXar


Wenn ich Sie verstehe, brauchen Sie aus anderen Gründen ein Motd, brauchen aber kein Backup. In der Konfiguration von sshd kann es nicht global auf Benutzerbasis eingerichtet werden. Daher müssen Sie die motd-Unterdrückung auf der Client-Seite lösen. Es gibt jedoch keinen Unterschied zwischen dem Text von motd und den Fehlermeldungen der Backup-Software. Beide sind Text im Terminal. Die einzige Lösung, die ich sehe, um zwischen diesen beiden Nachrichten einen Unterschied zu machen, besteht darin, die Nachricht zu filtern. Da die Nachrichten der Software schwer zu ändern sind, empfehle ich, den Text von motd zu ändern. Stellen Sie zum Beispiel einen Rahmen um:

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

motd message

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

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


1
2017-08-06 05:44





Lösung hier:

Falls Sie nicht für den Server verantwortlich sind und Sie motd oder sshd config nicht ändern können, verwenden Sie den folgenden Befehl:

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

Variante 1 - wenn Sie den Exit-Status des Remote-Befehls beachten:

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 wollen, führen Sie als letzten Remote-Befehl true aus

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

Beispiele für Fehlermeldungen:

Beispiel 1:

ssh Remotehost "gescheitert_remote_command 2> & 1 "2> / dev / null || echo Die SSH-Verbindung ist fehlgeschlagen, oder der Remote-Befehl hat einen Beendigungscode ungleich null zurückgegeben
bash: failed_remote_command: Befehl nicht gefunden
SSH-Verbindung oder Remote-Befehl ist fehlgeschlagen - beide haben einen Nicht-Null-Beendigungscode 127 zurückgegeben

Beispiel 2:

ssh Remotehost "gescheitert_remote_command 2> & 1; wahr"2> / dev / null || echo SSH-Verbindung fehlgeschlagen
bash: failed_remote_command: Befehl nicht gefunden

Beispiel 3a:

ssh Remotehost "gescheitert_remote_command 2> & 1; true "2> / dev / null || echo SSH-Verbindung fehlgeschlagen
# Es wird keine Nachricht angezeigt

Beispiel 3b:

ssh NichtexistingHost "gescheitert_remote_command 2> & 1; true "2> / dev / null || echo SSH-Verbindung fehlgeschlagen
SSH-Verbindung fehlgeschlagen

1
2018-04-01 09:51