为什么当启用 TTY 时,putty 没有获取 SSH_MSG_CHANNEL_EXTENDED_DATA 数据包?

为什么当启用 TTY 时,putty 没有获取 SSH_MSG_CHANNEL_EXTENDED_DATA 数据包?

引用RFC4254 § 6.6. 会话数据传输

会话的数据传输是使用 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日志:

https://pastebin.com/NSmuNHNx

ls -latr 1>&2 && pwd如果我将“连接 -> SSH -> 远程命令”设置为:它也不起作用

https://pastebin.com/rF1dRrKT

ls -latr 1>&2 && pwd但是,如果我将“连接 -> SSH -> 远程命令”设置为并且选中“SSH -> TTY -> 不分配伪终端”,它确实可以正常工作:

https://pastebin.com/R7zfLpgs

基本上,似乎使用 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 命令通常应该如何工作。

相关内容