Ich führe den folgenden Befehl aus und überwache die Ausgabedatei auf dem anderen System:
ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Wenn ich den Befehl ssh mit ^C
oder nur mit dem Terminal töte, an dem ich angemeldet bin, würde ich erwarten, dass auch der Remote-Befehl beendet wird. Dies ist jedoch nicht der Fall: /tmp/count
Erhält unabhängig davon alle Zahlen 1 bis 5 und ps -ejH
zeigt, dass die Shell und ihr sleep
Kind weiterlaufen.
Ist dieses erwartete Verhalten und wird es irgendwo dokumentiert? Kann ich es deaktivieren? Beim Lesen hatte ich erwartet, dass ich diese Art von Verhalten explizit mit nohup aktivieren muss, nicht damit es die Standardeinstellung ist.
Ich habe in den Manpages nach ssh und sshd gesucht, aber nichts Offensichtliches entdeckt, und Google weist mich auf Anweisungen zum Aktivieren dieses Verhaltens und nicht zum Deaktivieren hin.
Ich verwende Red Hat Enterprise Linux 6.2 mit einem Root-Login und einer Bash-Shell auf beiden Systemen.
-tt
anstelle von,-t
wenn ssh selbst kein tty zugewiesen hat. SSH erhält keine zugewiesene tty, wenn ssh sofort nach dem Aufruf über Optionen wie-f
oder im Hintergrund angezeigt wird-n
.Versuchen Sie, Ihrem
ssh
Befehl eine Pseudo-Tty zuzuweisen .ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'
Wenn Sie die SSH-Sitzung trennen, sollte der Prozess beendet werden.
Da dies eine Pseudo-Tty ist, wird Ihre Shell-Initialisierung wahrscheinlich keine Quellkonfigurationsdateien enthalten, sodass Ihr Befehl in einer sehr leeren Umgebung verbleibt. Möglicherweise müssen Sie eine
.ssh/environment
Datei einrichten , die Umgebungsvariablen wie PATH definiert. Vonman 1 ssh
quelle
Alternativ zur Verwendung der
-t
Optionssh
, den Remote-Befehl zu beenden, wenn derssh
Client beendet wird oder (beendet wird), kann eine Named Pipe verwendet werden, um "EOF in SIGHUP" zu konvertieren, wenn der Standard vonsshd
geschlossen wird (siehe Fehler 396 - sshd) Waisenprozesse, wenn kein Pty zugewiesen ist ).quelle
Dies ist der beste Weg, den ich gefunden habe, um dies zu tun. Sie möchten etwas auf der Serverseite, das versucht, stdin zu lesen, und dann die Prozessgruppe beendet, wenn dies fehlschlägt. Sie möchten jedoch auch ein stdin auf der Clientseite, das blockiert, bis der serverseitige Prozess abgeschlossen ist, und keine verbleibenden Prozesse wie <( Schlaf unendlich) könnte.
Es scheint stdout eigentlich nirgendwo umzuleiten, aber es fungiert als blockierende Eingabe und vermeidet das Erfassen von Tastenanschlägen.
Relevanter OpenSh-Fehler: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14
quelle
Wenn Sie dies deaktivieren möchten (scheinbar Standardverhalten), müssen Sie ssh-keep-living auf der Client- oder Serverseite aktivieren .
Wenn Sie sich die ssh-keep-alive-Optionen in den Manpages ansehen, können Sie sehen, dass sie standardmäßig deaktiviert sind.
quelle
Meine Antwort basiert auf Terus. Ich benötige ein
~/helper
Hilfsskript auf dem Server server.ip:Wenn es zB mit heißt
und wird
echo hello from server
auf server.ip ausgeführt, und dann wird der ssh-Client beendet.Wenn es zB mit heißt
kill -9 $CHID
stoppt das Skript auch auf dem Server. Für michkill -INT $CHID
funktioniert das nicht, aber ich weiß nicht warum.In der Antwort von teru wartet der Befehl ssh für immer, wenn der Remote-Befehl beendet ist, da er
cat
niemals beendet wird.Alle Antworten mit ssh -t haben bei mir nicht funktioniert
kill
, sondern nur mit Strg-C.Bearbeiten: Ich fand heraus, dass dies von einem neuen Ubuntu 14.01 zu einer älteren wissenschaftlichen Linux-Box funktionierte - aber nicht umgekehrt. Daher denke ich, dass es keine allgemeine Lösung gibt. Seltsam.
quelle