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
选项。