当使用 -T 和 -t 运行相同的 ssh 命令时,任何 stderr 输出都会分别到达 stderr 和 stdout。
没有分配 pty:
ssh -T user@host "echo >&2 foo"1>/tmp/out 2>/tmp/err
输出写入/tmp/err
。
使用 pty 分配:ssh -t user@host "echo >&2 foo"1>/tmp/out 2>/tmp/err
输出现已写入 /tmp/out
。
我有点理解,使用 pty 可以模拟完整的伪屏幕,并且输出处于原始模式。发送到屏幕的输出然后通过 stdout 发送回 ssh,并且 ssh 的 tty 也设置为原始模式。有人可以进一步解释一下吗?
最佳答案
tty 没有单独的输出和错误 channel 。只有一个输出 channel ;无论您写入什么内容,都只会发送到 CRT、串行端口、终端窗口、调制解调器、打印机或连接到 tty 的任何设备。
当分配一个 tty 来运行命令时,ssh
理论上可以将命令的 stdin 和 stdout 附加到 tty,而相反,将命令的 stderr 附加到一个单独的 stderr channel (管道),与 tty 完全分开。但是,这不符合在 tty 上运行的命令应将其所有 3 个 stdio channel 连接到同一 tty 的约定,并且某些命令可能会混淆或表现不同。因此 ssh
选择遵循约定。
当不使用 tty 时,ssh
可以自由地将命令的 stdin、stdout 和 stderr 连接到 3 个独立的单向管道。
关于unix - 为什么 OpenSSH RequestTTY 会导致 stderr 重定向到 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838624/