Как запустить gpg из скрипта cron? - PullRequest
26 голосов
/ 02 сентября 2008

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

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 silent перестает работать без вывода stdout / stderr.

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

Ответы [ 7 ]

25 голосов
/ 02 сентября 2008

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

7 голосов
/ 02 октября 2011

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

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

gpg: 0003608.cmd: подписать + сбой шифрования: нет секретного ключа

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

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

1 голос
/ 02 сентября 2008

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

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

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

В моем случае: "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. Крон сейчас:

0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)
0 голосов
/ 04 сентября 2008

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

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

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

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

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

0 голосов
/ 02 сентября 2008

Я однажды сталкивался с этой проблемой.

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

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

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

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

0 голосов
/ 02 сентября 2008

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

...