当 ssh 客户端的参数后跟一个交互式程序时,为什么 sshd 不使用伪终端?

Ron*_*nce 11 ssh pty

连接到 SSH 服务器的正常方法是ssh username@ip_address. 但是用户可能只想在远程机器上运行程序。所以程序名称跟在正常参数之后,即ssh username@ip_address <program_name>. 例如,ssh username@ip_address ls。除了交互式程序(也接受用户输入以及提供输出),例如top. 输出是

未设置 TERM 环境变量。

这意味着 sshd 和 top 程序之间没有连接(伪)终端。解决方案是-t在整个命令现在变成的地方添加参数ssh -t username@ip_address top

我的问题是为什么默认情况下 sshd 不能也使用伪终端与非交互式程序进行通信,因此不需要-t为交互式程序添加参数?

psm*_*ars 18

的确,正如其他人所说,PTY 有一定的开销——但是在运行远程命令时不使用 PTY 的一个重要原因是您会丢失信息。

通常,当您通过 ssh 远程运行命令时,命令stdoutstderr流将发送到本地stdoutstderr,这意味着您可以单独重定向/管道它们 - 例如:

$ ssh server ls foo bar
ls: cannot access bar: No such file or directory
foo
$ ssh server ls foo bar > stdout 2> stderr
$ cat stdout
foo
$ cat stderr
ls: cannot access bar: No such file or directory
Run Code Online (Sandbox Code Playgroud)

但是,如果您使用 PTY,则所有输出都会转到stdout,因为 PTY 没有单独的输出/错误流:

$ ssh -t server ls foo bar > stdout 2> stderr
$ cat stdout
ls: cannot access bar: No such file or directory
foo
$ cat stderr
$
Run Code Online (Sandbox Code Playgroud)

  • @ThomasDickey:你有没有*阅读*这个问题?哪里提到了开发商的意见? (2认同)

Jak*_*uje 7

手册页ssh描述了这一点:

当用户的身份已经由服务器,该服务器或者接受在非交互式会话执行给定的命令,或者如果没有指定命令,登录到机器,并为用户提供了一个正常的外壳作为互动会话。与远程命令或 shell 的所有通信都将自动加密。

这是特征,可能是由rsh行为的历史原因引起的。这是很合理的。大多数命令实际上都不是交互式的,分配 PTY 也不是免费的操作(这在 20 年前更为重要)。