26

我有一个脚本,它的一部分看起来像这样:

for file in `ls *.tar.gz`; do
  echo encrypting $file
  gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \
    --simple-sk-checksum -c  $file
done

出于某种原因,如果我手动运行此脚本,则可以正常工作并且所有文件都已加密。如果我将其作为 cron 作业运行,则echo $file工作正常(我在日志中看到“加密 <file>”),但文件没有被加密,并且 gpg 静默失败,没有 stdout/stderr 输出。

有什么线索吗?

4

7 回答 7

24

事实证明,答案比我预期的要容易。缺少一个--batch参数,gpg 尝试从 cron 作业不存在的 /dev/tty 读取。调试我使用了--exit-on-status-write-error参数。但是使用它时,我受到了退出状态 2 的启发,$?按照 Cd-Man 的建议通过回声报告。

于 2008-09-02T17:48:02.243 回答
7

就我而言,gpg 无法找到使用密钥的主目录:

gpg:没有默认密钥:没有密钥

gpg:0003608.cmd:签名+加密失败:没有密钥

所以我加了--homedir /root/.gnupg。最终的命令看起来像

echo '密码' | gpg -vvv --homedir /root/.gnupg --batch --passphrase-fd 0 --output /usr/share/file.gpg --encrypt --sign /usr/share/file.tar.bz2

于 2011-10-02T06:20:03.107 回答
1

当 cronjob 运行时,您应该确保 GPG 在您的路径中。您最好的猜测是获取 GPG 的完整路径(通过做which gpg)并使用完整路径运行它(例如/usr/bin/gpp...)。

其他一些调试技巧:

  • 运行 GPG 后输出的值$?(如:echo "$?")。如果成功,这将为您提供退出代码,该代码应为 0
  • 将 STDERR 重定向到 GPG 的 STDOUT,然后将 STDOUT 重定向到文件,以检查可能打印的任何错误消息(您可以通过命令行执行此操作/usr/bin/gpg ... 2>&1 >> gpg.log:)
于 2008-09-02T16:15:26.927 回答
0

确保运行 cron 作业的用户具有加密文件所需的权限。

于 2008-09-02T16:02:43.790 回答
0

我曾经遇到过这个问题。

我真的不能告诉你为什么,但我不认为 cron 使用与用户相同的环境变量执行。

实际上,我必须导出好的路径才能让我的程序运行良好。gpg 至少在尝试执行吗?

或者当 cron 执行时,您尝试加密的文件实际上是否在当前目录中?

也许尝试在您的脚本中执行echo whereis gpgandecho $PATH以查看它是否包含在内...为我工作。

于 2008-09-02T16:09:05.117 回答
0

@skinp Cron 作业由 sh 执行,而大多数现代 Unix 使用 bash 或 ksh 进行交互式登录。最大的问题(根据我的经验)是 sh 不理解以下内容:

export PS1='\u@\h:\w> '

需要更改为:

PS1='\u@\h:\w> '
export PS1

因此,如果 cron 运行一个使用第一种语法定义环境变量的 shell 脚本,那么在运行其他命令之前,将永远不会执行其他命令,因为 sh 试图定义变量时会爆炸。

于 2008-09-03T23:04:32.830 回答
0

就我而言:“gpg:解密失败:会话密钥错误”。

尝试添加/usr/bin/gpg,检查版本,设置--batch,设置--home(使用/root/.gnupg 和/home/user/.gnupg),但都不起作用。

/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file"

事实证明,AWS beanstalk 实例上的 cron 需要用于设置 --passphrase $GPG_PP 的环境变量。现在的 Cron:

0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)
于 2017-12-14T19:08:42.993 回答