Im
ssh host tail -f file
Der ssh
Client stellt über eine TCP-Verbindung eine Verbindung zum sshd
Server her host
. sshd
Läuft tail -f
mit seiner Standardausgabe auf eine Pipe umgeleitet. sshd
Liest, was vom anderen Ende der Pipe kommt, und kapselt es in das sshd-Protokoll, um es an den ssh
Client zu senden . (mit rshd
, tail
stdout wäre der Socket direkt gewesen, sshd
fügt aber Verschlüsselung hinzu und kann mehrere Streams (wie für Port / Agent / X11 / Tunnel Redirection, stderr) auf einer einzigen TCP-Verbindung multiplexen, muss also auf Pipes zurückgreifen).
Wenn Sie STRG-C drücken, wird ein SIGINT an den ssh
Client gesendet . Das lässt ssh
sterben. Nach dem Tod wird die TCP-Verbindung geschlossen. Und deshalb auf host
, sshd
stirbt auch. tail
wird nicht getötet, aber sein stdout ist jetzt eine Pfeife ohne Leser am anderen Ende. Wenn es das nächste Mal etwas auf seine Standardausgabe schreibt, erhält es eine SIEGELROHR und stirbt.
Im:
ssh -t host 'tail -f file'
Es ist dasselbe mit der Ausnahme, dass die Kommunikation zwischen sshd
und tail
über ein Pseudo-Terminal statt über eine Pipe erfolgt . tail
stdout ist ein Slave-Pseudo-Terminal (wie /dev/pts/12
) und was tail
auch immer read
auf der Masterseite geschrieben wird (möglicherweise durch die tty-Zeilendisziplin modifiziert) sshd
und wird gekapselt an den ssh
Client gesendet .
Auf der Client - Seite mit -t
, ssh
setzt das Terminal in raw
Betrieb. Dies deaktiviert insbesondere den kanonischen Terminalmodus und die Terminal-Signalverarbeitung.
Also, wenn Sie drücken Ctrl+C, statt der Client-Terminal - Linie Disziplin ein SIGINT zum Senden ssh
Job, dass sendet nur den ^C
Charakter über die Verbindung zu sshd
und sshd
schreibt , dass ^C
auf die Master - Seite des entfernten Terminals. Und die Leitungsdisziplin der Gegenstelle sendet ein SIGINT
an tail
. tail
dann stirbt sshd
und ssh
beendet und schließt die Verbindung und beendet sich (wenn es sonst noch nicht mit Portweiterleitungen oder anderem beschäftigt ist).
Auch mit -t
, wenn die ssh
Client - Formen (zum Beispiel , wenn Sie eingeben ~.
), wird die Verbindung geschlossen und sshd
stirbt. Als Ergebnis wird ein SIGHUP an gesendet tail
.
Achten Sie jetzt darauf, dass die Verwendung von -t
Nebenwirkungen hat. Beispielsweise werden mit den Standardeinstellungen des Terminals \n
Zeichen in konvertiert, \r\n
und je nach Remotesystem können weitere Vorgänge auftreten. Sie können daher auf dem Remotehost ein stty -opost
(zum Deaktivieren der Ausgabennachverarbeitung) ausgeben, wenn diese Ausgabe nicht vorgesehen ist ein Terminal:
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
Ein weiterer Nachteil der Verwendung von -t
/ -tt
ist, dass stdout und stderr auf dem Client nicht unterschieden werden. Sowohl stdout als auch stderr des Remote-Befehls werden in die ssh
stdout des Clients geschrieben:
$ ssh localhost ls /x | wc -l
ls: cannot access /x: No such file or directory
0
$ ssh -t localhost ls /x | wc -l
1
-t
, wenn derssh
Client stirbt (zB wenn Sie eintreten~.
)" Was ist~.
nochmal?~.
ist die Escape-Sequenz, die Sie eingeben, um den Client zu trennen. Sieheman ssh
für weitere Einzelheiten.Sie benötigen eine Terminalzuordnung auf der Remote-Seite:
oder auch
quelle
-t
oder-tt
funktioniert. Aber ich kann den wahren Grund dafür immer noch nicht verstehen: Sagen wir, wenn ich die Shell aus der Ferne aufrufe und die Verbindung beende, wird die Shell beendet. Gehttail -f
aber nicht. Natürlich habe ich schon über-t
Option in gelesenman ssh
, aber es hat nicht viel geholfen. Anscheinend verstehe ich einige Generika nicht, und ich würde mich freuen, wenn Sie einige Dokumente vorschlagen, um darüber zu lesen, oder es wahrscheinlich selbst erklären. Vielen Dank!sshd
sendet aSIGHUP
. Aber wo kein Terminal ist, kann es kein Auflegen der Terminalverbindung geben ...SIGHUP
und andere Signale, weiß noch fast nichts darüber.tail -f
, dann habe ich es geöffnethtop
und gesendetSIGHUP
(durch Drücken vonF9
->1
->Enter
) und estail -f
wird beendet! Also, Grund sollte etwas anders sein ..tail
nicht reagiert würdeSIGHUP
. Das Problem ist, dassSIGHUP
nichttail
ohne Pseudo-Terminal gesendet wird . Sie können sehen , dass durch das Anbringenstrace
antail
Fällen in beiden.