Как запустить gpg из script, выполняемого cron?
У меня есть script, у которого есть часть, которая выглядит так:
for file in `ls *.tar.gz`; do
echo encrypting $file
gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \
--simple-sk-checksum -c $file
done
По какой-то причине, если я запускаю этот script вручную, отлично работает и все файлы зашифрованы. Если я запустил это как задание cron, echo $file
работает отлично (я вижу "шифрование < файл > " в журнале), но файл не получает зашифрованный файл, а gpg отключается без вывода stdout/stderr.
Любые подсказки?
Ответы
Ответ 1
Получается, что ответ был проще, чем я ожидал. Отсутствует параметр --batch
, gpg пытается прочитать из /dev/tty, который не существует для заданий cron. Чтобы отладить, я использовал параметр --exit-on-status-write-error
. Но чтобы использовать это, я был вдохновлен статусом выхода 2, о котором сообщается, эхом $?
, как предположил Cd-Man.
Ответ 2
В моем случае gpg can not find home dir для использования ключей:
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
Ответ 3
Вы должны убедиться, что GPG находится на вашем пути, когда запущен cronjob. Лучше всего было бы получить полный путь к GPG (выполнив which gpg
) и запустить его с использованием полного пути (например, /usr/bin/gpp...
).
Некоторые другие советы по отладке:
- выводит значение
$?
после запуска GPG (например: echo "$?" ). Это дает код выхода, который должен быть 0, если он был успешно выполнен
- перенаправить STDERR в STDOUT для GPG, а затем перенаправить STDOUT в файл, чтобы проверить любые сообщения об ошибках, которые могут быть распечатаны (вы можете сделать это с командной строкой:
/usr/bin/gpg ... 2>&1 >> gpg.log
)
Ответ 4
убедитесь, что пользователь, выполняющий задание cron, имеет разрешения, необходимые для шифрования файла.
Ответ 5
Однажды я столкнулся с этой проблемой.
Я не могу сказать вам почему, но я не думаю, что cron выполняет ту же переменную среды, что и пользователь.
Мне действительно пришлось экспортировать хороший путь для того, чтобы мои программы выполнялись хорошо.
Выполняется ли gpg по крайней мере?
Или файлы, которые вы пытаетесь encypt фактически в текущем каталоге, когда cron выполняет?
Возможно, попробуйте выполнить echo whereis gpg
и echo $PATH
в script, чтобы убедиться, что он включен... Работал для меня.
Ответ 6
@skinp Задачи Cron выполняются sh, тогда как в большинстве современных Unix-ов используются bash или ksh для интерактивных логинов. Самая большая проблема (по моему опыту) заключается в том, что sh не понимает таких вещей, как:
export PS1='\[email protected]\h:\w> '
который необходимо изменить на:
PS1='\[email protected]\h:\w> '
export PS1
Итак, если cron запускает оболочку script, которая определяет переменную среды, используя первый синтаксис, перед запуском какой-либо другой команды другая команда никогда не будет выполнена, потому что sh бомбы пытаются определить переменную.
Ответ 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"
Выяснилось, что для 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)