Lösung 1:
Ich bin mir nicht sicher, warum Sie eine Abneigung dagegen haben, dies richtig zu machen - 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.
Hinweis:Fügen Sie ~/.hushlogin zu /etc/skel hinzu, damit neue Benutzer-Home-Verzeichnisse mit der Datei erstellt werden.
Aktualisierung:
Ohne weitere Informationen zu Ihrem Backup-Cron-Job besteht mein einziger anderer Vorschlag darin, die Ausgabe des Befehls in eine Datei umzuleiten (oder Cron in einer E-Mail erfassen zu lassen) und die Ausgabe der SSH-Sitzung in /dev/null. 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 ein wenig mit den Befehlen herumspielen, aber das sollte Ihnen den Einstieg erleichtern.
Lösung 2:
Wenn Sie dies auf Benutzerbasis wünschen, führen Sie einfach einen touch ~/.hushlogin
aus und Sie sind fertig mit OpenSSH.
Aktualisieren :Wie an anderer Stelle erwähnt, pam_motd
kann so konfiguriert werden, dass kein .hushlogin
pro Benutzer verwendet wird; überprüfen Sie /etc/login.defs
für HUSHLOGIN_FILE
. Es kann so konfiguriert werden, dass alle Benutzer in /etc/hushlogins
aufgeführt sind oder ähnliches.
Lösung 3:
@note Alle Beispiele gehen davon aus, dass Sie eine Variable connectionString
gesetzt haben mit so etwas wie [email protected]
.
Wie ich zur Lösung gekommen bin
Mit ssh -T
sollte für einfache Befehle funktionieren. Dies gibt beispielsweise keine zusätzlichen Informationen aus:
ssh -T $connectionString "echo 'blah'"
Das Problem ist, wenn Sie versuchen, here-doc zu verwenden, um viele Befehle auszuführen. Zum Beispiel - unten wird NICHT funktionieren - es wird die Nachricht des Tages (MoTD) zurückgeben und könnte Ihnen auch "stdin:is not a tty" zeigen.
somethingLocal='something local'
ssh -T $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
Um das Problem zu umgehen, müssen Sie zuerst Befehle in einer lokalen Variablen speichern und sie dann 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 sie 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
Verwenden Sie dies wie folgt:
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 auch so:
silentSsh $connectionString < getlines.sh
Lösung 4:
Wie wäre es mit diesem Hack?;-P
ssh -t [email protected] '/bin/bash'
Folgendes ist nicht gültig:
Bestehen von -T
an ssh, um die tty-Zuweisung zu deaktivieren:
ssh -T machineName 'echo foo'
Lösung 5:
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.