Without -t
, sshd
ruft die Standardausgabe der Remote-Shell (und der untergeordneten Elemente like sleep
) und stderr über zwei Pipes ab (und sendet die Eingaben des Clients auch über eine andere Pipe).
sshd
Wartet auf den Prozess, in dem die Anmeldeshell des Benutzers gestartet wurde. Nach Abschluss dieses Prozesses wird jedoch auf eof auf der stdout-Pipe gewartet (nicht auf die stderr-Pipe, zumindest im Fall von openssh).
Und eof tritt auf, wenn auf der schreibenden Seite der Pipe kein Dateideskriptor für einen Prozess geöffnet ist, was normalerweise nur dann der Fall ist, wenn alle Prozesse, deren stdout nicht auf etwas anderes umgeleitet wurde, nicht mehr ausgeführt werden.
Wenn Sie verwenden -t
, werden sshd
keine Rohre verwendet. Stattdessen erfolgt die gesamte Interaktion (stdin, stdout, stderr) mit der Remote-Shell und ihren untergeordneten Objekten über ein Pseudo-Terminal-Paar.
Bei einem Pseudo-Terminal-Paar gibt es für die sshd
Interaktion mit der Masterseite keine vergleichbare EOF-Behandlung und keine Möglichkeit, festzustellen, ob auf der Slave-Seite des Pseudo-Terminals noch Prozesse mit offenen FDS vorhanden sind, sodass nur auf die Beendigung von gewartet wird Der Prozess, in dem die Anmeldeshell des Remotebenutzers ausgeführt und dann beendet wird.
Bei diesem Ausgang wird die Masterseite des Pty-Paars geschlossen, was bedeutet, dass das Pty zerstört wird, sodass vom Slave gesteuerte Prozesse ein SIGHUP erhalten (was sie standardmäßig beenden würde).