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