Wie kann ich ssh verwenden, um einen Befehl auf einem entfernten Unix-Rechner auszuführen und zu beenden, bevor der Befehl ausgeführt wird?

17

Wie kann ich ssh verwenden, um einen Befehl auf einem Unix-Computer auszuführen und zu beenden, bevor der Befehl ausgeführt wird?

Zum Beispiel, wenn ich tippe

ssh localhost 'sleep 60 &'

ssh bleibt an meinem Terminal hängen, bis der Ruhezustand abgeschlossen ist, obwohl der Ruhezustand im Hintergrund ausgeführt wird.

Richard Hoskins
quelle
Sie möchten wahrscheinlich das &Äußere der Anführungszeichen.
Brad Gilbert
1
Nein, das bringt nur das gesamte Kit und Kaboodle in den Hintergrund und ich kann mein Passwort nicht eingeben.
Richard Hoskins

Antworten:

19

SSH hat einen -f-Schalter, der genauso funktioniert wie nohup auf Ihrem Client, aber es ermöglicht, dass ssh nach einem Passwort fragt. Benutze es so:

ssh localhost -f 'command'

Aber : SSH wird weiterhin im Hintergrund ausgeführt. Wenn Sie also den Client herunterfahren, bevor der Befehl auf dem Server ausgeführt wurde, wird er abgebrochen. Wenn Sie möchten, dass die ssh-Verbindung nach Ausführung des Befehls geschlossen wird, können Sie den Bildschirm auf der Serverseite verwenden:

ssh localhost -f 'screen -d -m sleep 60'
Martin
quelle
Wenn ich den Befehl 'ssh remotemachine -n' mit langer Laufzeit> withremoteredirects 2> & 1 </ dev / null & 'tue und der Client herunterfährt, wird der Befehl ausgeführt?
Richard Hoskins
Afaik nein. Wenn die SSH-Verbindung unterbrochen wird, sollte der SSH-Daemon alle Terminals "innerhalb" von SSH beenden. Ans, da das Terminal den Befehl gestartet hat, auf den sie beendet werden würden, da ihr übergeordneter Prozess beendet wurde. Aber es lohnt sich zu versuchen;)
Martin
Was ist mit "nohup" anstelle von "screen" auf der Serverseite?
Richard Hoskins
@ Brad Gilbert Nichts? Ich kann mir ein paar Dinge vorstellen, aber eine Sache, die ich nicht gemeinsam habe, ist, dass 'screen' nicht auf allen POSIX-Maschinen verfügbar ist.
Richard Hoskins
6

Verwenden Sie die Umleitung nohup, stdout / stderr und führen Sie den Befehl im Hintergrund aus:

 nohup ssh localhost 'sleep 60' >/dev/null 2>/dev/null &

EDIT: Oder noch besser, verwenden Sie einfach den Parameter -f von ssh:

ssh -f localhost 'sleep 60'
neu242
quelle
Sie könnten wahrscheinlich die beiden Weiterleitungen mit kombinieren &>/dev/null.
Brad Gilbert
@BradGilbert Diese Syntax ist nicht POSIX-kompatibel. Es ist schwer zu argumentieren, dass Kompatibilität geopfert werden muss, um ein paar Zeichen zu speichern.
Tripleee
2

Oder sshstarten screenSie nach dem Anmelden mit , wenn Sie später wiederkommen möchten, um den Fortschritt oder die Ausgabe zu überprüfen.

Arjan
quelle
Sie können auch "tmux" verwenden, das ich persönlich einfacher zu konfigurieren finde. Beide Anwendungen sind ziemlich gleichwertig, wobei jede ihre Vor- und Nachteile hat.
mzuther