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

7 scp logs io-redirection

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

不带 tee 的 scp 输出

frrinstd@loneqflocfd0034.uk.db.com:/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
Run Code Online (Sandbox Code Playgroud)

scp WITH tee 的输出

frrinstd@loneqflocfd0034.uk.db.com:/apps/flowrisk/valservice/release/London/uat2/vs-server-2.1.16-21190-linux-amd64-frod-uat2-London-dist.zip /apps/flowrisk/uatldn/valservice
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 6

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

scp remotehost:/path/to/file /local/file >/dev/tty
Run Code Online (Sandbox Code Playgroud)

如果要保存 的进度输出scp,可以使用script.

script -q /dev/stdout -c 'scp remotehost:/path/to/file /local/file' | tee scp.log
Run Code Online (Sandbox Code Playgroud)

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

ssh remotehost 'cat /path/to/file' | pv -bpt >/local/file
Run Code Online (Sandbox Code Playgroud)


小智 5

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