在 `ssh` 会话中让 `pv` 工作

在 `ssh` 会话中让 `pv` 工作

pv当我通过 远程呼叫时,我该如何开始工作ssh

例如

a@a-virtual-machine:~$ ssh [email protected] "pv < ~/Documents/Local/staging.sql.gz" | gunzip  > /dev/null 

这不会打印任何常见的pv进度信息。FWIW 远程系统是 Ubuntu 20。

答案1

pv 仅在检测到终端(tty) 在 stderr 上可用。用于pv -f覆盖此设置并使其无论如何都显示进度条。

ssh foo "pv -f largefile.sql.gz" | gunzip > largefile.sql

在常规模式下ssh要求服务器分配一个终端,但在批处理(命令)模式下则不会,因为这会破坏正在传输的二进制数据。

你可以在其他情况下即使在命令模式下也可以使用该-t选项启用终端分配,例如,您可以ssh -t user@server htop让命令在终端中运行,但在这种特殊情况下,它可能会损坏 gzip 压缩的数据。

当 pv 在本地使用时,它有单独的“stdout”进入管道,还有“stderr”进入 tty,允许它单独输出二进制数据和终端控制代码。但不幸的是,使用 SSH 时,无法有选择地为 stderr 启用 tty,但不为 stdout 启用 tty — 要么两个流都经过 tty 处理,要么都不处理。

幸运的是,pv 有-f --force选项让它在没有终端的情况下显示进度。如果没有 tty,它也无法确定本地终端的宽度;默认值 80 应该足够好,但如果您希望它看起来完美,请使用该-w --width选项。

相关内容