我的脚本有一个看起来像这样的部分:
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>
任何线索?
答案 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...
)。
其他一些调试技巧:
$?
的值(如:echo“$?”)。这将为您提供退出代码,如果成功,则应该为0 /usr/bin/gpg ... 2>&1 >> gpg.log
)答案 3 :(得分:0)
确保运行cron作业的用户具有加密文件所需的权限。
答案 4 :(得分:0)
我曾经遇到过这个问题。
我无法告诉你原因,但我不认为cron使用与用户相同的环境变量执行。
我实际上必须为我的程序导出良好的路径才能执行。 gpg是否至少试图执行?
或者当你执行cron时,你试图在当前目录中实际加密的文件是什么?
也许尝试在您的脚本中执行echo whereis gpg
和echo $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)