为什么使用OpenSSH的RequestTTY会导致标准错误输出重定向到标准输出?

7
当使用-T和-t参数运行相同的ssh命令时,任何标准错误输出分别到达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也设置为原始模式。能否有人进一步解释一下?
1个回答

15

tty没有单独的输出和错误通道。它只有一个输出通道;你写入的所有内容都会简单地传输到CRT、串口、终端窗口、调制解调器、打印机或与tty连接的任何设备。

在为运行命令分配tty时,ssh理论上可以将命令的stdin和stdout附加到tty上,而将命令的stderr附加到完全独立于tty的单独的stderr通道(管道)上。然而,这与在tty上运行的命令应该拥有所有三个stdio通道连接到同一tty的惯例不符,并且某些命令可能会混淆或表现不同。因此,ssh选择遵循惯例。

使用tty时,ssh可以自由地将命令的stdin、stdout和stderr附加到3个单独的单向管道上。


这正是我所想的,感谢您的解释。因此,stdout和stderr被发送到tty。我在某个地方读到过,当这种情况发生且调用ssh具有tty(pty)时,它会进入原始模式。我不再记得关于熟练模式与原始模式的所有细节。有人可以进一步阐明吗? - gabor
2
是的,本地tty(客户端上的)被设置为原始模式,因为远程pty(ssh为评论分配的那个)处于熟悉模式,你只需要/想要其中之一进行熟悉处理...或者如果在远程系统上运行的应用程序有意将(远程)tty设置为原始模式,那么这是因为它是一个curses/全屏/任何期望从用户一直到底部都是原始模式的应用程序。所以无论哪种方式,本地tty都应该是原始的。 - Celada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接