2008-09-02 8 views
26

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

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

ответ

25

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

+2

Спасибо за это, у нас была такая же проблема! – latortuga 2010-02-23 23:58:27

0

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

0

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

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

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

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

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

1

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

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

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

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

export PS1='\[email protected]\h:\w> ' 

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

PS1='\[email protected]\h:\w> ' 
export PS1 

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

5

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

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

0

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

Оказалось, что хрон на AWS Beanstalk экземпляра требуется переменная среды используется для установки --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)