unix - 为什么 OpenSSH RequestTTY 会导致 stderr 重定向到 stdout?

标签 unix openssh pty

当使用 -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/

相关文章:

bash - Openssh 私钥到 RSA 私钥

c - 如何从 ssh session 中获取伪终端主文件描述符?

c - 在 pthread_join() 中阻塞

unix - grep:警告:递归目录循环

git - 在防火墙后通过 ssh 访问 git 存储库

python - Paramiko 是否支持基于证书的身份验证

python - python3中如何将字节控制台转换为字符串?

go - SSH 脚本使用 pty 和 io.Copy 通过菜单流式输出

c - Unix Socket 发送/接收长消息

image - ImageMagick可以返回图像大小吗?