Без -t
, sshd
получает stdout удаленной оболочки (и дочерних, как sleep
) и stderr через два канала (а также отправляет входные данные клиента через другой канал).
sshd
ожидает процесс, в котором он запустил оболочку входа пользователя, но также и после того, как этот процесс завершился, ожидает eof на канале stdout (по крайней мере, на канале stderr в случае openssh).
И eof происходит, когда файловый дескриптор любого процесса, открытого на конце записи канала, отсутствует, что обычно происходит только тогда, когда все процессы, чей stdout не перенаправлен на что-то другое, пропали.
Когда вы используете -t
, sshd
не использует трубы. Вместо этого все взаимодействие (stdin, stdout, stderr) с удаленной оболочкой и ее дочерними элементами выполняется с использованием одной псевдо-терминальной пары.
С псевдо-терминальной парой для sshd
взаимодействия со стороной мастера нет аналогичной обработки eof или какого-либо способа узнать, существуют ли еще процессы с открытыми fds для ведомой стороны псевдотерминала, поэтому он просто ожидает завершения процесс, в котором он выполнил оболочку входа удаленного пользователя и затем завершил работу.
После этого выхода главная сторона пары pty закрывается, что означает, что pty уничтожен, поэтому процессы, управляемые ведомым, получат SIGHUP (который по умолчанию завершит их).