连接到 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 远程运行命令时,命令stdout
和stderr
流将发送到本地stdout
和stderr
,这意味着您可以单独重定向/管道它们 - 例如:
$ 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)
手册页ssh
描述了这一点:
当用户的身份已经由服务器,该服务器或者接受在非交互式会话执行给定的命令,或者如果没有指定命令,登录到机器,并为用户提供了一个正常的外壳作为互动会话。与远程命令或 shell 的所有通信都将自动加密。
这是特征,可能是由rsh
行为的历史原因引起的。这是很合理的。大多数命令实际上都不是交互式的,分配 PTY 也不是免费的操作(这在 20 年前更为重要)。
归档时间: |
|
查看次数: |
4948 次 |
最近记录: |