Небуферизация stderr означает, что данные немедленно записываются в fd, но он не может гарантировать, что записанные данные будут обработаны получателем (pty, socket, pipe, ...).
For ssh -T
, см. Этот пример (в Debian Linux):
[STEP 103] # ssh -T 127.0.0.1 'ls -l /proc/$$/fd'
total 0
lr-x------ 1 root root 64 Aug 4 13:59 0 -> pipe:[4610144]
l-wx------ 1 root root 64 Aug 4 13:59 1 -> pipe:[4610145]
l-wx------ 1 root root 64 Aug 4 13:59 2 -> pipe:[4610146]
lr-x------ 1 root root 64 Aug 4 13:59 3 -> /proc/23662/fd
[STEP 104] #
Как видно, sshd
использует 3 канала для связи со своим дочерним процессом (таким образом, sshd
может различие guish между данными stdout и данными stderr). Для ребенка гарантируется, что данные, записанные в stderr, будут немедленно отправлены в конвейер, но решение о том, когда данные будут обработаны, полностью зависит от процесса sshd
. ( ОБНОВЛЕНИЕ : и даже после того, как sshd
отправит данные обратно клиенту ssh
, клиенту ssh
по-прежнему решать, когда он обработает полученные данные.)
Что касается ssh -tt
, ребенку будет выделен ребенок. Stdin, stdout и stderr дочернего процесса будут открыты на pty, и sshd
не может различать guish между данными stdour и данными stderr, поэтому результат ожидается.
Для проверки ssh -tt
не может различать guish между данными стандартного вывода и данными стандартного потока:
[STEP 109] # ssh -T 127.0.0.1 'echo hi; echo bye >&2'
hi
bye
[STEP 110] # ssh -T 127.0.0.1 'echo hi; echo bye >&2' 2> /dev/null
hi
[STEP 111] #
[STEP 112] # ssh -tt 127.0.0.1 'echo hi; echo bye >&2'
hi
bye
Connection to 127.0.0.1 closed.
[STEP 113] # ssh -tt 127.0.0.1 'echo hi; echo bye >&2' 2> /dev/null
hi
bye
[STEP 114] #