Holen Sie sich eine Anzeige des SSH-Befehls

Holen Sie sich eine Anzeige des SSH-Befehls

Ich muss eine Anzeige erhalten, ob der sshBefehl 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 sshBefehl 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 truenach 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:

  1. eine Remote-Verbindung herstellen (und nicht schließen);
  2. 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%/*}"

verwandte Informationen