scp/sftp 命令的输出进度到标准输出和 Linux 服务器上的文件

scp/sftp 命令的输出进度到标准输出和 Linux 服务器上的文件

我正在编写一个发布脚本,它使用 scp/sftp 从远程服务器获取文件,我们也希望将此脚本的输出记录到release.log 文件中。我正在使用“tee”来实现这一点,它对所有事情都工作得很好,我的意思是标准输出和错误,但是当涉及到文件下载的进度(这需要时间来复制)时,它不会显示在控制台或文件中。

不带 tee 的 scp 输出

[email protected]:/apps/flowrisk/valservice/release/London/uat2/vs-server-2.1.16-21190-linux-amd64-frod-uat2-London-dist.zip /apps/flowrisk/uatldn/valservice
vs-server-2.1.16-21190-linux-amd64-frod-uat2-London-dist.zip                                                               100%   78MB  39.1MB/s   00:02

scp with tee 的输出

[email protected]:/apps/flowrisk/valservice/release/London/uat2/vs-server-2.1.16-21190-linux-amd64-frod-uat2-London-dist.zip /apps/flowrisk/uatldn/valservice

有人可以告诉我如何让它在控制台上也用 tee 输出 scp/sftp 命令的进度,以便用户知道发生了什么吗?

答案1

在日志文件中包含进度表听起来不是很有用。scp将其标准输出连接到终端来运行怎么样?这确实有一个缺点,如果脚本在传输过程中被中断,日志中将没有任何内容来指示进度(但这是一个非常小的缺点,因为部分传输的大小)。

scp remotehost:/path/to/file /local/file >/dev/tty

如果你想保存进度输出scp,你可以使用script

script -q /dev/stdout -c 'scp remotehost:/path/to/file /local/file' | tee scp.log

或者,您可以插入pv在管道中获取进度指示。这并不好,scp因为pv只知道传输的字节数,而不知道总数。

ssh remotehost 'cat /path/to/file' | pv -bpt >/local/file

答案2

看起来如果 stdout 不是 tty,scp 将禁用进度表。我链接到的文章包含一些可能对您有用的伪终端黑客技术;或者您可以进入 scp 源并禁用isatty()检查。

相关内容