Подтвердить что ты не робот

Как запустить 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.

Любые подсказки?

4b9b3361

Ответ 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)