Как запустить 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
работает нормально (я вижу "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)