Ich muss eine Anzeige erhalten, ob der ssh
Befehl erfolgreich war oder nicht, ohne den verbundenen Server zu verlassen.
Ich verwende diesen Befehl:
ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
Mein Problem mit diesem Befehl ist, dass ich nicht auf dem verbundenen Server bleibe. Ich möchte nach dem ssh
Befehl keinen Test hinzufügen, sondern es so machen, wie ich es bisher gemacht habe – mit einem Befehl.
Hier ist ein Beispiel, wie es jetzt funktioniert:
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@dhcppc4 ~]$ hostname
dhcppc4
Und hier ist ein Beispiel dessen, was ich möchte:
[nir@dhcppc4 ~]$ ssh -q user1@server1 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_NOK
[nir@dhcppc4 ~]$ hostname
dhcppc4
[nir@dhcppc4 ~]$ ssh -q user1@server2 "echo 2>&1" && echo SSH_OK || echo SSH_NOK
SSH_OK
[nir@server2 ~]$ hostname
server2
Antwort1
Sie müssen "SSH_OK" ausgebenauf dem Remote-Serverund „SSH_NOK“ auf dem lokalen Host:
ssh -t -q $host 'echo '"$host"'SSH_OK; exec $SHELL' || echo "$host: SSH_NOK"
Aber ich würde mich an Johns Vorschlag halten, die Eingabeaufforderung so einzustellen, dass sie angibt, an welchem Computer Sie sich befinden – und das ist tatsächlich das, was Sie in Ihrer Frage vorgeschlagen haben. Sie sollten vielleicht noch einmal darüber nachdenken, ob all das zusätzliche Drucken wirklich so nützlich ist.
Sie sollten auch etwas genauer ausführen, was Sie genau erreichen möchten – es könnte einen besseren Weg geben. Wenn Sie beispielsweise ein Skript ausführen, dessen Ausgabe analysiert wird und das möglicherweise mit einem Fehler endet, der jedoch anhand der Ausgabe erkennbar ist, sollten Sie true
nach der Skriptausführung (oder als letzten Befehl, der ausgeführt wird, bevor das Skript endgültig beendet wird) Folgendes hinzufügen – dadurch wird sichergestellt, dass Ihre Sitzung erfolgreich beendet wird (d. h. mit einem Beendigungsstatus von Null) und „echo SSH_NOK“ nicht aufgerufen wird.
Antwort2
Was Sie wollen, ist nicht möglich. Wenn Sie auf dem neuen Server bleiben, führen Sie den Teil des Befehls zum Abrufen des Statusechos erst aus, nachdem Sie den Server verlassen haben. So funktioniert SSH. Wenn Sie den neuen Hostnamen in Ihrer Eingabeaufforderung sehen, wissen Sie, dass es funktioniert hat und Sie sich auf dem Zielserver befinden.
Antwort3
Sie müssen die Ausgabe von verarbeiten echo 2>&1
.
Beispiel
$ ssh -q skinner "echo 2>&1"
$
Folgendes würde ich mit einem meiner Hosts, Skinner, tun:
$ ssh -q skinnerrr "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_NOK
$ ssh -q skinner "echo 2>&1 > /dev/null" && echo SSH_OK || echo SSH_NOK
SSH_OK
Antwort4
Wenn Ihr Ziel darin besteht, zunächst sicherzustellen, dass Sie eine Verbindung zum Remote-Server herstellen können, und dann eine Reihe von Aufgaben lokal und remote ausführen zu können, dann empfehle ich Folgendes:
- eine Remote-Verbindung herstellen (und nicht schließen);
- mach dein Zeug.
Um eine Remote-Verbindung herzustellen, führen Sie eine Master-Sitzung aus. Um dann Remote-Aufgaben auszuführen, können Sie sich an die bestehende Verbindung anhängen. Slave-Verbindungen verwenden den bestehenden TCP-Stream, sie erfordern keine zusätzliche Authentifizierung, sind also erfolgreich (und schnell herzustellen), außer natürlich, wenn das Netzwerk oder der Remote-Host ausfällt.
ssh_control=$(mktemp -d)/ssh.control
ssh -M -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
if [ $? -eq 0 ]; then
do_some_local_stuff
ssh -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
do_some_more_local_stuff
if ! ssh -O check -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1; then
echo 'Uh-oh! The SSH connection died abruptly.'
fi
fi
ssh -O exit -o ControlMaster=yes -o ControlPath="$ssh_control" -n user1@server1
rm "$ssh_control"
rmdir "${ssh_control%/*}"