Dies ist eine Folgefrage zu Wie verwenden Sie ssh in einem Shell-Skript? Frage. Wie kann ich den Befehl ssh zurückgeben, wenn ich einen Befehl auf dem Remotecomputer ausführen möchte, der im Hintergrund auf diesem Computer ausgeführt wird? Wenn ich versuche, nur das kaufmännische Und (&) am Ende des Befehls einzufügen, hängt es einfach. Die genaue Form des Befehls sieht folgendermaßen aus:
ssh user@target "cd /some/directory; program-to-execute &"
Irgendwelche Ideen? Zu beachten ist, dass bei Anmeldungen am Zielcomputer immer ein Textbanner angezeigt wird und ich SSH- Schlüssel eingerichtet habe, sodass kein Kennwort erforderlich ist.
/dev/null
.< /dev/null
bedeutet? Vielen Dank.Dies war für mich der sauberste Weg, dies zu tun:
Das einzige, was danach ausgeführt wird, ist der eigentliche Befehl auf dem Remote-Computer
quelle
-n
wird nicht benötigt wie-f
impliziert-n
ssh -f
Lässt den SSH-Prozess verbunden, nur im Hintergrund. Mit den Lösungen / dev / null kann ssh schnell getrennt werden, was möglicherweise vorzuziehen ist.Fd's umleiten
Die Ausgabe muss umgeleitet werden, wobei
&>/dev/null
sowohl stderr als auch stdout nach / dev / null umgeleitet werden und ein Synonym für>/dev/null 2>/dev/null
oder ist>/dev/null 2>&1
.Klammern
Der beste Weg ist zu verwenden,
sh -c '( ( command ) & )'
wo Befehl etwas ist.Nohup Shell
Sie können nohup auch direkt verwenden, um die Shell zu starten:
Schöner Start
Ein weiterer Trick besteht darin, den Befehl / die Shell mit nice zu starten:
quelle
nohup
ausmacht und warum und wann Sie ihn verwenden würdennice
? Ich denke, das würde dieser Antwort viel hinzufügen.Wenn Sie die Verbindung nicht offen halten können, können Sie den Bildschirm verwenden , wenn Sie die Rechte zur Installation haben.
So trennen Sie die Bildschirmsitzung: ctrl-a d
So listen Sie Bildschirmsitzungen auf:
So fügen Sie eine Sitzung erneut hinzu:
Beachten Sie, dass der Bildschirm innerhalb jeder Sitzung auch mehrere Shells erstellen kann. Ein ähnlicher Effekt kann mit tmux erzielt werden .
So trennen Sie die tmux-Sitzung: ctrl-b d
So listen Sie Bildschirmsitzungen auf:
So fügen Sie eine Sitzung erneut hinzu:
Der Standard-tmux-Steuerschlüssel ' ctrl-b' ist etwas schwierig zu verwenden, aber es gibt einige Beispiele für tmux-Konfigurationen, die mit tmux geliefert werden und die Sie ausprobieren können.
quelle
screen
?Ich wollte nur ein funktionierendes Beispiel zeigen, das Sie ausschneiden und einfügen können:
quelle
Der schnellste und einfachste Weg ist die Verwendung des Befehls 'at':
quelle
at
Befehlszeilenargumente nach der Zeit und nicht nur aus einer Datei akzeptiert würden .Ich denke, Sie müssen einige dieser Antworten kombinieren, um das zu bekommen, was Sie wollen. Wenn Sie nohup in Verbindung mit dem Semikolon verwenden und das Ganze in Anführungszeichen setzen, erhalten Sie:
das scheint für mich zu funktionieren. Mit nohup müssen Sie das & nicht an den auszuführenden Befehl anhängen. Wenn Sie die Ausgabe des Befehls nicht lesen müssen, können Sie sie auch verwenden
um alle Ausgaben nach / dev / null umzuleiten.
quelle
Das hat bei mir mal funktioniert:
quelle
Sie können es so machen ...
quelle
Wenn ich einen Befehl auf einem Remotecomputer ausführen muss, der kompliziert ist, füge ich den Befehl gerne in ein Skript auf dem Zielcomputer ein und führe dieses Skript einfach mit ssh aus.
Zum Beispiel:
Und dann führe ich einfach diesen Befehl auf dem Quellcomputer aus:
quelle
Ich habe versucht, dasselbe zu tun, aber mit der zusätzlichen Komplexität, die ich versucht habe, es von Java aus zu tun. Auf einem Computer, auf dem Java ausgeführt wird, habe ich versucht, ein Skript auf einem anderen Computer im Hintergrund (mit nohup) auszuführen.
In der Befehlszeile hat Folgendes funktioniert: (Möglicherweise benötigen Sie die "-i keyFile" nicht, wenn Sie sie nicht benötigen, um zum Host zu ssh).
Beachten Sie, dass in meiner Befehlszeile nach dem "-c" ein Argument steht, das alle in Anführungszeichen steht. Aber damit es am anderen Ende funktioniert, braucht es immer noch die Anführungszeichen, also musste ich maskierte Anführungszeichen einfügen.
Von Java aus hat Folgendes funktioniert:
Es hat ein bisschen Versuch und Irrtum gekostet, um dies zum Laufen zu bringen, aber es scheint jetzt gut zu funktionieren.
quelle
Es erschien mir sehr praktisch, eine Remote- TMXX-Sitzung mit der folgenden
tmux new -d <shell cmd>
Syntax durchzuführen :Dadurch wird eine neue Sitzung auf dem
elsewhere
Host gestartet, und der Befehl ssh auf dem lokalen Computer kehrt fast sofort zur Shell zurück. Sie können dann ssh zum Remote-Host undtmux attach
zu dieser Sitzung. Beachten Sie, dass der lokale tmux nicht ausgeführt wird, sondern nur remote!Wenn Sie möchten, dass Ihre Sitzung nach Abschluss des Auftrags bestehen bleibt, fügen Sie nach Ihrem Befehl einfach einen Shell-Launcher hinzu. Vergessen Sie jedoch nicht, in Anführungszeichen zu setzen:
quelle
Dies sollte den Befehl ausführen und eine Prozess-ID zuweisen. Sie können einfach -f YOUR-LOG.log verfolgen, um die Ergebnisse zu sehen, die darauf geschrieben werden, sobald sie eintreten. Sie können sich jederzeit abmelden und der Vorgang wird fortgesetzt
quelle
Sie können dies ohne nohup tun:
quelle
Ich denke, das ist was Sie brauchen: Zuerst müssen Sie
sshpass
auf Ihrem Computer installieren . dann können Sie Ihr eigenes Skript schreiben:quelle
Befolgen Sie zunächst dieses Verfahren:
Melden Sie sich bei A als Benutzer a an und generieren Sie ein Paar Authentifizierungsschlüssel. Geben Sie keine Passphrase ein:
Verwenden Sie nun ssh, um ein Verzeichnis ~ / .ssh als Benutzer b auf B zu erstellen. (Das Verzeichnis ist möglicherweise bereits vorhanden, was in Ordnung ist.)
Fügen Sie zum Schluss den neuen öffentlichen Schlüssel von a an b @ B: .ssh / authorized_keys hinzu und geben Sie das Passwort von b ein letztes Mal ein:
Von nun an können Sie sich bei B als b von A als ohne Passwort anmelden:
dann funktioniert dies ohne Eingabe eines Passworts
ssh b @ B "cd / some / directory; Programm zum Ausführen &"
quelle