21

我正在尝试从安装脚本(使用 scp)捕获输出并记录它。但是,我没有得到 scp 打印的所有内容,即进度条。

屏幕输出:

将 /user2/cdb/builds/tmp/uat/myfiles/* 复制到服务器 /users/myfiles 作为 cdb

cdb@server 的密码:myfile 100% |**********************************| 2503 00:00

日志输出:

将 /user2/cdb/builds/tmp/uat/myfiles/* 复制到服务器 /users/myfiles 作为 cdb

我真的很想知道我的文件到了那里。这是我现在尝试的无济于事:

myscript.sh 2>&1 | 三通 mylogfile.log

有没有人有一个很好的方法来捕获 scp 输出并记录它?

谢谢。

4

9 回答 9

32

scp 使用控制代码将其进度条打印到终端。它将检测您是否重定向输出并因此省略进度条。

您可以通过使用默认安装在大多数发行版上的“脚本”命令诱使 scp 认为它在终端中运行来解决这个问题:

script -q -c "scp server:/file /tmp/" > /tmp/test.txt

test.txt 的内容将是:

file    0%    0     0.0KB/s   --:-- ETA
file   18%   11MB  11.2MB/s   00:04 ETA
file   36%   22MB  11.2MB/s   00:03 ETA
file   54%   34MB  11.2MB/s   00:02 ETA
file   73%   45MB  11.2MB/s   00:01 ETA
file   91%   56MB  11.2MB/s   00:00 ETA
file  100%   61MB  10.2MB/s   00:06

...这可能是你想要的。

我在将交互式脚本的输出重定向到日志文件时偶然发现了这个问题。在日志中没有结果不是问题,因为您始终可以评估退出代码。但我真的希望交互式用户看到进度条。这个答案解决了这两个问题。

于 2012-10-17T00:21:38.713 回答
10

看起来您只是错过了日志中的 scp 是否成功。

我猜滚动条不会打印到标准输出并使用 ncurses 或其他类型的 TUI?

你可以看看 scp 的返回值,看看它是否成功。像

scp myfile user@host.com:. && echo success!

man scp

scp exits with 0 on success or >0 if an error occurred.
于 2008-10-14T19:21:37.187 回答
2

这里没有一个答案对我有用,我需要在很长的地理距离上递归地复制包含大量文件的大目录,所以我想记录进度&& echo success!到目前为止还不够)。

我最终设计并以某种方式工作的是:

scp -vrC root@host:/path/to/directory . 2> copy.log &

使用-v详细日志记录的技巧(-C允许压缩和-r递归)。

整理日志文件

grep file copy.log | wc -l

让我看到到目前为止复制的文件数量。

于 2019-12-07T15:00:07.857 回答
1

也许您可以使用“脚本”来记录终端会话。

于 2008-10-14T19:20:51.180 回答
1
scp myfile user@host.com:. && echo success! 

非常有帮助,但是要将消息写入日志文件,我将其更改为这样

scp myfile user@host.com:. && echo myfile successfully copied! >> logfile 2>&1

这将写入“我的文件已成功复制!” 消息到日志文件。

于 2014-07-03T06:46:15.827 回答
1

我还不能评论:(所以我会在这里添加更新...

@Martin 为我提供了最好的解决方案,尽管如果您的 scp 命令位于脚本的中间,那么它的输出可能会出现在之后实际运行的命令之后。

我认为这是因为脚本必须在子外壳中运行命令,但我还没有测试。

编辑:它确实产生了一个外壳,所以如果你需要以顺序方式运行(并且确实失败)(比如在构建脚本中),那么你必须围绕脚本命令的使用添加一些逻辑。

IE

脚本 -q -c "你的命令" && sleep 1

或类似的东西,以便您的父外壳在继续之前等待子外壳完成。

于 2015-02-06T00:18:11.100 回答
0

是的,我最近试图从 proc_open() 的 php 脚本中获取输出我失去了一段时间试图获取输出的安静时间:-) 但是这里有点晚了,然后我在这里阅读这篇文章让我意识到我真的不需要这个垃圾输出到我的脚本

只需退出代码即可完成工作:-)

$exit_code = proc_close($process);

于 2009-08-12T03:06:36.680 回答
0
$ grep -r "Error" xyz.out > abc.txt

在上面的命令中,我将输出存储到文件 abc.txt 中。

此命令用于在文件xyz.outgrep中搜索包含错误的文本并将输出存储在abc.txt中而不显示在控制台上。

于 2016-05-31T12:31:38.567 回答
-1

尝试:

scp server:/file /tmp/ > /dev/tty
于 2014-10-28T16:42:03.770 回答