会话的数据传输是使用 SSH_MSG_CHANNEL_DATA 和 SSH_MSG_CHANNEL_EXTENDED_DATA 数据包以及窗口机制完成的。已为 stderr 数据定义了扩展数据类型 SSH_EXTENDED_DATA_STDERR。
我的问题是...为什么当我ls -latr 1>&2 && pwd
通过PuTTY中的交互式shell执行此操作时,我看不到任何SSH_MSG_CHANNEL_EXTENDED_DATA数据包? 这是我的PuTTY日志:
ls -latr 1>&2 && pwd
如果我将“连接 -> SSH -> 远程命令”设置为:它也不起作用
ls -latr 1>&2 && pwd
但是,如果我将“连接 -> SSH -> 远程命令”设置为并且选中“SSH -> TTY -> 不分配伪终端”,它确实可以正常工作:
基本上,似乎使用 TTY 会阻止发送 SSH_MSG_CHANNEL_EXTENDED_DATA。
为什么?
答案1
对于交互式会话,远程 SSH 服务器将分配一个 PTY(伪 TTY)。然后它将调用用户的 shell,并将 PTY 作为标准输入、输出和错误。写入标准输出和标准错误的输出最终写入同一个 PTY,并混合成单个数据流。SSH 服务器读取写入 PTY 的输出并将其发送到客户端。SSH 服务器不会将写入 stdout 的数据与写入 stderr 的数据分开,我不知道是否有办法做到这一点。
这与您在终端中运行命令时获得的行为相同:
$ ls /etc/group /etc/does-not-exist
ls: /etc/does-not-exist: No such file or directory
/etc/group
$
ls
将一些数据写入标准输出,将一些数据写入标准错误。所有这些数据都混杂在终端中。唯一能识别哪个是哪个的方法是了解它们的ls
工作原理以及 unix 命令通常应该如何工作。