SSH 输出不是行缓冲的吗?

SSH 输出不是行缓冲的吗?

我正在远程计算机上运行一个脚本,如下所示:

ssh $host "pip install -r /path/to/requirements.txt"

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

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

(另外,显而易见的是:当我$host“手动”进入并运行命令时,输出是行缓冲的,正如预期的那样)

答案1

用于ssh -t ...强制进行伪 tty 分配(这是您通过 ssh 正常登录时得到的结果。)

答案2

稍微扩展一下 Ryan Fox 的答案:许多程序(大多数? - 这是任何 C 程序的默认设置)在与终端通信时都会对标准输出进行行缓冲,但在其他情况下会完全缓冲它。 (C 标准规定,当 stdout “可以确定不引用交互设备”时,它最初是完全缓冲的。)

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

答案3

要进一步扩展瑞安福克斯的答案,ssh -t对我来说也不起作用,但ssh -tt确实有效。请参阅有关 -t 的 ssh 手册页:

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

相关内容