创建tarball,动态加密并将tar消息保存在日志文件中

时间:2015-05-14 09:50:26

标签: bash shell tar gnupg tee

在OSX上我正在尝试创建目录的tarball并在运行中加密 它使用gpg并将tar消息的输出保存在日志文件中 后来的分析。

虽然tar + gpg在飞行中很容易

tar zcvf - foo | gpg -e -r foo@bar.com -o foo.tgz.gpg

到目前为止,我没有记录tar的输出(也许是gpg中的一个) case)到日志文件。

我尝试了几种

的组合
tar | gpg | tee
tar | gpg 2>&1 >(tee)
tar | gpg > file.log

这里有什么帮助吗?

干杯 的Davide

2 个答案:

答案 0 :(得分:1)

2> file.log应该实现它。 如果您想要tee stderr流并将其保留到原始目的地,则可以通过

实现

2> >(tee file.log >&2)

在你的例子中:

tar zcvf - foo 2> >(tee file.log >&2) | gpg -e -r foo@bar.com -o foo.tgz.gpg

您的尝试不会成功,因为管道(|)仅将前一个命令的stdout转发到当前命令的stdin。当前命令(gpg)无法访问上一个命令stderrtar)。 stderr已经到达目的地(您的终端,最有可能)。

2> >(command )个管道(非常简单地>()stderrstdin command之下创建一个未命名的操作系统级管道。由于command是子进程,因此其stderr(#2)描述符将指向与父进程的stderr相同的文件。

答案 1 :(得分:0)

问题是当使用2>在该行的末尾,您只重定向第二个命令(gpg)stderr。如果你想(似乎)重定向tar命令stderr,你应该添加2>管道之前的日志文件,如下所示:

tar zcvf - foo 2> tar.log | gpg -e -r foo@bar.com -o foo.tgz.gpg