У меня есть скрипт, который используется для подписи deb и создания репо. Соответствующий код ниже, что вызывает проблемы:
export GNUPGHOME=foo/gnupg/
killall -q gpg-agent
eval $(gpg-agent --daemon --homedir $GNUPGHOME --allow-preset-passphrase)
echo ${signPass} | /usr/lib/gnupg2/gpg-preset-passphrase --preset $fingerprint
dpkg-sig -g '--no-tty' --sign builder bar/baz/app.deb
Это работает на Ubuntu 14.04, но как только я попытаюсь запустить его на сервере с установленным Ubuntu 16.04, я получаю следующие ошибки: [ ! d1] dpkg-deb: building package 'app' in 'bar/baz/app.deb'.
Processing bar/baz/app.deb..
gpg: gpg-agent is not available in this session
gpg: Sorry, no terminal at all requested - can't get input
E: Signing failed. Error code: 512
Ubuntu 14.04 пакеты:
gnupg - 1.4.16-1ubuntu2.3 gnupg-agent - 2.0.22-3ubuntu1.3 gnupg2 - 2.0 .22-3ubuntu1.3 gpgv - 1.4.16-1ubuntu2.3Ubuntu 14.04 пакеты:
gnupg - 1.4.16-1ubuntu2 .3 gnupg-agent 2.1.11-6ubuntu2 gnupg-agent - 2.0.22-3ubuntu1.3 gpgv - 1.4.20-1ubuntu3.1 gnupg2 - 2.0.22- 3ubuntu1.3Я знаю, что dpkg-sig вызывает /usr/bin/gpg напрямую, и я использовал update-alternatives, чтобы установить /usr/bin/gpg как gpg2, но это дает мне ошибки с " inappropiate ioctl для устройства ".
Дополнительная информация:
Этот скрипт запускается как часть задания сборки на «Bamboo». Пароль передается как переменная среды, так как он надежно хранится. Я не хочу менять конвейер этого приложения.
Вы говорите, что фраза pass в ${signPass} поступает из некоторого безопасного хранилища. Если вы надежно сохраняете пароль, вы также можете надежно сохранить цепочку ключей с секретным ключом без пароля.
Измените пароль пустого. Вы можете использовать свой любимый менеджер цепочки ключей или следующую команду:GNUPGHOME=... gpg2 --passwd user_id
Хранить цепочку ключей в защищенном хранилище. Запустите dpkg-sig с параметрами GPG, которые используют безопасно сохраненную цепочку ключей: dpkg-sig --gpg-options "--secret-keyring /path/to/secret-keyring.gpg"
В качестве альтернативы вы можете использовать секретный ключ паролей без пароля с dpkg-sig (см. править ниже):
dpkg-sig -f /path/to/pass-phrase ...
Вы даже можете использовать стандартный ввод:
printf '%s' "${signPass}" | dpkg-sig -f - ...
см. править ниже Похоже, что длинная ошибка прерывает опцию -f, но вы можете обойти ее через --gpg-options '--passphrase-file /path/to/pass-phrase' (за исключением того, что вы не можете использовать имена файлов фреймов с пробелами).
Вы говорите, что фраза pass в ${signPass} поступает из некоторого безопасного хранилища. Если вы надежно сохраняете пароль, вы также можете надежно сохранить цепочку ключей с секретным ключом без пароля.
Измените пароль пустого. Вы можете использовать свой любимый менеджер цепочки ключей или следующую команду:GNUPGHOME=... gpg2 --passwd user_id
Хранить цепочку ключей в защищенном хранилище. Запустите dpkg-sig с параметрами GPG, которые используют безопасно сохраненную цепочку ключей: dpkg-sig --gpg-options "--secret-keyring /path/to/secret-keyring.gpg"
В качестве альтернативы вы можете использовать секретный ключ паролей без пароля с dpkg-sig (см. править ниже):
dpkg-sig -f /path/to/pass-phrase ...
Вы даже можете использовать стандартный ввод:
printf '%s' "${signPass}" | dpkg-sig -f - ...
см. править ниже Похоже, что длинная ошибка прерывает опцию -f, но вы можете обойти ее через --gpg-options '--passphrase-file /path/to/pass-phrase' (за исключением того, что вы не можете использовать имена файлов фреймов с пробелами).