У меня есть сценарий, который выглядит так:
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 silent не работает без вывода stdout / stderr.
Какие-нибудь подсказки?





убедитесь, что у пользователя, выполняющего задание cron, есть разрешения, необходимые для шифрования файла.
Однажды я столкнулся с этой проблемой.
Я не могу сказать вам, почему, но я не думаю, что cron выполняется с той же переменной среды, что и пользователь.
На самом деле мне пришлось экспортировать хороший путь, чтобы мои программы хорошо выполнялись. Gpg хотя бы пытается выполнить?
Или файлы, которые вы пытаетесь зашифровать, действительно находятся в текущем каталоге при выполнении cron?
Возможно, попробуйте выполнить echo whereis gpg и echo $PATH в своем сценарии, чтобы увидеть, включены ли они ... Сработало для меня.
Вы должны убедиться, что GPG находится на вашем пути, когда cronjob запущен. Лучше всего получить полный путь к GPG (выполнив which gpg) и запустить его, используя полный путь (например, /usr/bin/gpp...).
Некоторые другие советы по отладке:
$? после запуска GPG (например: echo "$?"). Это дает вам код выхода, который должен быть 0, если это удалось./usr/bin/gpg ... 2>&1 >> gpg.log)Оказывается, ответ оказался проще, чем я ожидал. Отсутствует параметр --batch, gpg пытается читать из / dev / tty, которого нет для заданий cron. Для отладки я использовал параметр --exit-on-status-write-error. Но чтобы использовать это, меня вдохновил статус выхода 2, о котором сообщалось, повторяя $?, как предлагал Cd-Man.
Большое спасибо, такая же проблема здесь. Они должны включать параметр --batch в gpg --help ... по крайней мере, в моей версии (1.4.10) он отсутствует.
@skinp Задания Cron выполняются sh, тогда как большинство современных Unix используют bash или ksh для интерактивного входа в систему. Самая большая проблема (по моему опыту) в том, что sh не понимает таких вещей, как:
export PS1='\u@\h:\w> '
который необходимо изменить на:
PS1='\u@\h:\w> '
export PS1
Таким образом, если cron запускает сценарий оболочки, который определяет переменную среды с использованием первого синтаксиса, перед запуском какой-либо другой команды другая команда никогда не будет выполнена, потому что sh вылетает, пытаясь определить переменную.
В моем случае gpg не может найти домашний каталог для использования ключей:
gpg: no default secret key: No secret key
gpg: 0003608.cmd: sign+encrypt failed: No secret key
Поэтому я добавил --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
В моем случае: «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"
Оказалось, что для cron в экземпляре beanstalk AWS требуется переменная среды, которая используется для установки --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)
Спасибо за это, у нас была точно такая же проблема!