Как запустить gpg из скрипта, запущенного cron?

У меня есть сценарий, который выглядит так:

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.

Какие-нибудь подсказки?


person Marcin    schedule 02.09.2008    source источник


Ответы (7)


Оказывается, ответ оказался проще, чем я ожидал. Отсутствует параметр --batch, gpg пытается читать из / dev / tty, которого нет для заданий cron. Для отладки я использовал --exit-on-status-write-error param. Но чтобы использовать это, меня вдохновил статус выхода 2, о котором сообщалось путем повторения $?, как предлагал Cd-Man.

person Marcin    schedule 02.09.2008
comment
Спасибо за это, у нас была точно такая же проблема! - person latortuga; 24.02.2010
comment
Большое спасибо, такая же проблема здесь. Они должны включать параметр --batch в gpg --help ... по крайней мере, в моей версии (1.4.10) он отсутствует. - person tbk; 02.04.2012

В моем случае gpg не может найти домашний каталог для использования ключей:

gpg: нет секретного ключа по умолчанию: нет секретного ключа

gpg: 0003608.cmd: знак + шифрование не удалось: секретный ключ отсутствует

Я добавил --homedir /root/.gnupg. Последняя команда может выглядеть так:

эхо "пароль" | gpg -vvv --homedir /root/.gnupg --batch --passphrase-fd 0 --output /usr/share/file.gpg --encrypt --sign /usr/share/file.tar.bz2

person Enginer    schedule 02.10.2011

Вы должны убедиться, что GPG находится на вашем пути, когда cronjob запущен. Лучше всего получить полный путь к GPG (выполнив which gpg) и запустить его, используя полный путь (например, /usr/bin/gpp...).

Некоторые другие советы по отладке:

  • вывести значение $? после запуска GPG (например: echo "$?"). Это дает вам код выхода, который должен быть 0, если это удалось.
  • перенаправить STDERR в STDOUT для GPG, а затем перенаправить STDOUT в файл, чтобы проверить любые сообщения об ошибках, которые могут быть напечатаны (вы можете сделать это из командной строки: /usr/bin/gpg ... 2>&1 >> gpg.log)
person Grey Panther    schedule 02.09.2008

убедитесь, что у пользователя, выполняющего задание cron, есть разрешения, необходимые для шифрования файла.

person Nick Berardi    schedule 02.09.2008

Однажды я столкнулся с этой проблемой.

Я не могу сказать вам почему, но я не думаю, что cron выполняется с той же переменной окружения, что и пользователь.

На самом деле мне пришлось экспортировать хороший путь, чтобы мои программы хорошо выполнялись. Gpg хотя бы пытается выполнить?

Или файлы, которые вы пытаетесь зашифровать, действительно находятся в текущем каталоге при выполнении cron?

Может быть, попробуйте выполнить echo whereis gpg и echo $PATH в своем скрипте, чтобы увидеть, включен ли он ... Сработало для меня.

person skinp    schedule 02.09.2008

@skinp Задания Cron выполняются sh, тогда как большинство современных Unix используют bash или ksh для интерактивного входа в систему. Самая большая проблема (по моему опыту) в том, что sh не понимает таких вещей, как:

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

который необходимо изменить на:

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

Таким образом, если cron запускает сценарий оболочки, который определяет переменную среды с использованием первого синтаксиса, перед запуском какой-либо другой команды другая команда никогда не будет выполнена, потому что sh вылетает, пытаясь определить переменную.

person dr-jan    schedule 03.09.2008

В моем случае: «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)
person Mike Lapinskas    schedule 14.12.2017