Senza -t
, sshd
ottiene lo stdout della shell remota (e piace ai bambini sleep
) e stderr tramite due pipe (e invia anche l'input del client tramite un'altra pipe).
sshd
attende il processo in cui è stata avviata la shell di accesso dell'utente, ma anche, dopo che quel processo è terminato, attende la fine di eof sulla pipe stdout (non almeno la pipe stderr nel caso di openssh).
Eof si verifica quando non esiste alcun descrittore di file da parte di alcun processo aperto all'estremità di scrittura della pipe, che in genere accade solo quando tutti i processi che non hanno il loro stdout reindirizzato a qualcos'altro sono andati.
Quando si utilizza -t
, sshd
non utilizza i tubi. Invece, tutte le interazioni (stdin, stdout, stderr) con la shell remota e i suoi figli sono fatte usando una coppia pseudo-terminale.
Con una coppia pseudo-terminale, per sshd
interagire con il lato master, non esiste una gestione eof simile o alcun modo per sapere se ci sono ancora processi con fds aperti sul lato slave dello pseudo-terminale, quindi attende solo la fine di il processo in cui ha eseguito la shell di accesso dell'utente remoto e quindi si chiude.
All'uscita, il lato master della coppia pty viene chiuso, il che significa che il pty viene distrutto, quindi i processi controllati dallo slave riceveranno un SIGHUP (che per impostazione predefinita li terminerebbe).