Sem -t
, sshd
obtém o stdout do shell remoto (e filhos como sleep
) e stderr através de dois canais (e também envia a entrada do cliente por meio de outro canal).
sshd
espera pelo processo no qual iniciou o shell de login do usuário, mas também, após esse processo ter terminado, espera por eof no stdout pipe (não no stderr pipe no caso do openssh, pelo menos).
E eof acontece quando não há descritor de arquivo por qualquer processo aberto no final da escrita do pipe, o que geralmente acontece quando todos os processos que não tiveram seu stdout redirecionado para outra coisa desapareceram.
Quando você usa -t
, sshd
não usa pipes. Em vez disso, toda a interação (stdin, stdout, stderr) com o shell remoto e seus filhos é feita usando um par pseudo-terminal.
Com um par de pseudo-terminais, para sshd
interagindo com o lado mestre, não há nenhum tratamento similar ou qualquer maneira de saber se ainda há processos com fds abertos para o lado escravo do pseudo-terminal, então apenas aguarda o término do processo no qual ele executou o shell de login do usuário remoto e então sai.
Após essa saída, o lado mestre do par pty é fechado, o que significa que a pty é destruída, então os processos controlados pelo escravo receberão um SIGHUP (que, por padrão, os terminaria).