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

StackOverflow https://stackoverflow.com/questions/39867

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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.

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

который нужно изменить на:

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

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

В моем случае: " 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)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top