【问题标题】:How to run gpg from a script run by cron?如何从 cron 运行的脚本运行 gpg?
【发布时间】:2010-09-07 13:55:30
【问题描述】:

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

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

有什么线索吗?

【问题讨论】:

    标签: bash cron gnupg


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      我曾经遇到过这个问题。

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

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

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

      也许尝试在您的脚本中执行 echo whereis gpgecho $PATH 以查看它是否包含在内...对我有用。

      【讨论】:

        【解决方案3】:

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

        其他一些调试技巧:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 谢谢你,我们遇到了完全相同的问题!
          • 非常感谢,同样的问题。他们应该在 gpg --help 中包含 --batch 选项......至少在我的版本(1.4.10)中它丢失了。
          【解决方案5】:

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

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

          需要改成:

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

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

          【讨论】:

            【解决方案6】:

            在我的情况下,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

            【讨论】:

              【解决方案7】:

              就我而言:“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)
              

              【讨论】:

                猜你喜欢
                • 2011-01-01
                • 2018-03-22
                • 2014-11-01
                • 1970-01-01
                • 2013-11-26
                • 2018-07-05
                • 1970-01-01
                • 2015-03-16
                • 2020-09-05
                相关资源
                最近更新 更多