Sans -t
, sshd
obtient la sortie standard du shell distant (et des enfants comme sleep
) et stderr via deux canaux (et envoie également l'entrée du client via un autre canal).
sshd
attend le processus dans lequel il a démarré le shell de connexion de l'utilisateur, mais aussi, après la fin de ce processus, attend eof sur le canal stdout (pas le canal stderr dans le cas de openssh au moins).
Et eof se produit lorsqu'il n'y a pas de descripteur de fichier par un processus ouvert à la fin de l'écriture du canal, ce qui ne se produit généralement que lorsque tous les processus qui n'ont pas redirigé leur stdout vers autre chose ont disparu.
Lorsque vous utilisez -t
, sshd
n'utilise pas de tuyaux. Au lieu de cela, toutes les interactions (stdin, stdout, stderr) avec le shell distant et ses enfants se font à l'aide d'une paire pseudo-terminale.
Avec une paire pseudo-terminale, pour sshd
interagir avec le côté maître, il n'y a pas de traitement eof similaire ni aucun moyen de savoir s'il y a encore des processus avec des fds ouverts du côté esclave du pseudo-terminal, donc il attend juste la fin de le processus dans lequel il a exécuté le shell de connexion de l'utilisateur distant, puis se termine.
À cette sortie, le côté maître de la paire pty est fermé, ce qui signifie que le pty est détruit, de sorte que les processus contrôlés par l'esclave recevront un SIGHUP (qui, par défaut, les mettrait fin).