如何从cron运行的脚本运行gpg?

时间:2008-09-02 15:58:50

标签: bash cron gnupg

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

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工作正常(我在日志中看到“encrypting< file>”),但文件没有加密,gpg静音失败,没有stdout / stderr输出。 / p>

任何线索?

7 个答案:

答案 0 :(得分:25)

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

答案 1 :(得分:7)

在我的情况下,gpg无法找到使用密钥的主目录:

  

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

     

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

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

  

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

答案 2 :(得分:1)

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

其他一些调试技巧:

  • 在运行GPG后输出$?的值(如:echo“$?”)。这将为您提供退出代码,如果成功,则应该为0
  • 将STDERR重定向到STDOUT for GPG,然后将STDOUT重定向到文件,以检查可能打印的任何错误消息(您可以执行以下命令行:/usr/bin/gpg ... 2>&1 >> gpg.log

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我曾经遇到过这个问题。

我无法告诉你原因,但我不认为cron使用与用户相同的环境变量执行。

我实际上必须为我的程序导出良好的路径才能执行。 gpg是否至少试图执行?

或者当你执行cron时,你试图在当前目录中实际加密的文件是什么?

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

答案 5 :(得分:0)

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

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

需要更改为:

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

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

答案 6 :(得分: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)