我正在编写一个发布脚本,它使用 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()
检查。