SSH 输出不是行缓冲的吗?

Dav*_*ver 37 ssh

我在这样的远程机器上运行一个脚本:

ssh $host "pip install -r /path/to/requirements.txt"
Run Code Online (Sandbox Code Playgroud)

但输出不是行缓冲的;不是一次返回一行,而是在连接终止时一次性打印所有行 (~10)。

这是怎么回事?有没有办法强制它们被行缓冲?

(另外,声明一下:当我通过 ssh 进入$host并“手动”运行命令时,输出是行缓冲的,正如预期的那样)

小智 47

使用ssh -t ...强制伪终端分配(也就是当你通过SSH正常登录你会得到什么。)


小智 23

稍微扩展一下 Ryan Fox 的回答:许多程序(大多数? - 这是任何 C 程序的默认设置)在与终端交谈时行缓冲标准输出,否则完全缓冲它。(C 标准规定,当“可以确定不引用交互式设备”时,stdout 最初是完全缓冲的。)

所以你所看到的是你远程运行的程序的输出(给定标准输出)不是行缓冲的;ssh 只是传递它得到的东西。(我认为 ssh 实际上根本不对其输出进行缓冲 - 这将是确保用户看到远程程序意图的最不神奇的方式。)


小智 7

为了进一步扩展瑞恩福克斯的答案,ssh -t对我也不起作用,但ssh -tt确实如此。请参阅有关 -t 的 ssh 手册页:

多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty