如何最好地捕获和记录scp输出?

时间:2008-10-14 19:08:52

标签: logging shell scp

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

屏幕输出:

  

复制   / user2 / cdb / builds / tmp / uat / myfiles / * to   server / users / myfiles as cdb

     

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

日志输出:

  

复制   / user2 / cdb / builds / tmp / uat / myfiles / * to   server / users / myfiles as cdb

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

  

myscript.sh 2>& 1 | tee mylogfile.log

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

感谢。

9 个答案:

答案 0 :(得分:23)

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

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

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

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

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

答案 1 :(得分:8)

看起来你只是想知道scp是否成功了。

我猜测滚动条不会打印到stdout并使用ncurses或其他类型的TUI?

您可以查看scp的返回值以查看它是否成功。喜欢

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

man scp

scp exits with 0 on success or >0 if an error occurred.

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

非常有用,但要将消息写入日志文件,我就像这样更改了

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

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

答案 4 :(得分:1)

尝试:

scp server:/file /tmp/ > /dev/tty

答案 5 :(得分:1)

我无法发表评论:(所以我会在这里添加更新...

@Martin对我来说是最好的解决方案,尽管如果你的scp命令在你的脚本中间,那么它的输出可能出现在之后实际运行的命令之后。

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

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

脚本-q -c"你的命令" &安培;&安培;睡1个

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

答案 6 :(得分:0)

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

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

$ exit_code = proc_close($ process);

答案 7 :(得分:0)

$ grep -r "Error" xyz.out > abc.txt

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

grep命令用于在文件 xyz.out 中搜索包含错误的文本,并将输出存储在 abc.txt 中没有在控制台上显示。

答案 8 :(得分:0)

这里没有一个答案对我有用,我需要递归复制大目录并在远距离上复制很多文件,因此我想记录进度&& echo success!是由远远不够)。

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

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

使用-v进行冗长的日志记录(-C允许压缩和-r递归)。

抓取日志文件

grep file copy.log | wc -l

允许我查看到目前为止已复制的文件数。