[Bash] Как запустить gpg из скрипта, выполняемого cron?


Answers

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

Question

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

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 работает отлично (я вижу «шифрование <файл>» в журнале), но файл не получает зашифрованный и gpg молчат с ошибкой без вывода stdout / stderr.

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




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




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

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

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

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

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




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

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

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



В моем случае 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




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

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

Мне на самом деле пришлось экспортировать хороший путь для выполнения моих программ. По крайней мере, gpg пытается выполнить?

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

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