Im
ssh host tail -f file
Der sshClient stellt über eine TCP-Verbindung eine Verbindung zum sshdServer her host. sshdLäuft tail -fmit seiner Standardausgabe auf eine Pipe umgeleitet. sshdLiest, was vom anderen Ende der Pipe kommt, und kapselt es in das sshd-Protokoll, um es an den sshClient zu senden . (mit rshd, tailstdout wäre der Socket direkt gewesen, sshdfü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 sshClient gesendet . Das lässt sshsterben. Nach dem Tod wird die TCP-Verbindung geschlossen. Und deshalb auf host, sshdstirbt auch. tailwird 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 sshdund tailüber ein Pseudo-Terminal statt über eine Pipe erfolgt . tailstdout ist ein Slave-Pseudo-Terminal (wie /dev/pts/12) und was tailauch immer readauf der Masterseite geschrieben wird (möglicherweise durch die tty-Zeilendisziplin modifiziert) sshdund wird gekapselt an den sshClient gesendet .
Auf der Client - Seite mit -t, sshsetzt das Terminal in rawBetrieb. 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 sshJob, dass sendet nur den ^CCharakter über die Verbindung zu sshdund sshdschreibt , dass ^Cauf die Master - Seite des entfernten Terminals. Und die Leitungsdisziplin der Gegenstelle sendet ein SIGINTan tail. taildann stirbt sshdund sshbeendet 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 sshClient - Formen (zum Beispiel , wenn Sie eingeben ~.), wird die Verbindung geschlossen und sshdstirbt. Als Ergebnis wird ein SIGHUP an gesendet tail.
Achten Sie jetzt darauf, dass die Verwendung von -tNebenwirkungen hat. Beispielsweise werden mit den Standardeinstellungen des Terminals \nZeichen in konvertiert, \r\nund 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/ -ttist, dass stdout und stderr auf dem Client nicht unterschieden werden. Sowohl stdout als auch stderr des Remote-Befehls werden in die sshstdout 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