Как обойти "вывод ключа apt не должен анализироваться"?
Я автоматизирую установку Docker. Что-то вроде этого:
if apt-key fingerprint 0EBFCD88 | grep "Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88" > /dev/null
then
# proceed
fi
Это работало нормально в старых версиях apt-key
, но последние версии имеют две проблемы:
- Другой формат вывода: я могу взломать
Предупреждение:
Warning: apt-key output should not be parsed (stdout is not a terminal)
Ясно, что я могу взломать это, просто перенаправить stderr
в /dev/null
, Это просто сделало меня любопытным:
Как эти замечательные люди предлагают мне проверить свои ключевые отпечатки пальцев? Или я в корне ошибаюсь, желая автоматизировать это, это победит? (Думаю, что нет, поскольку я все еще вручную снял ожидаемый отпечаток с веб-сайта, но не стесняйтесь сказать мне иначе...)
5 ответов
Из источников apt-key вы можете установить APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE
в непустое значение, чтобы отключить это предупреждение.
Вы также можете использовать "grep -q", чтобы вам не нужно было перенаправлять стандартный вывод в /dev/null
или.
Чтобы ответить на часть "я понимаю это в корне неправильно":
Я верю, что, возможно, да. Это причина предупреждения.
Вы не пишете, что именно делаете, но одна вещь, которую нужно понять, это:
Срок действия ключей истекает, поэтому через некоторое время отпечаток в вашем скрипте устареет и, возможно, он больше не будет работать так, как ожидалось.
После того, как хранилище и его ключ установлены, система каким-то образом обновляет ключ автоматически, но при первоначальном добавлении хранилища необходимо предоставить обновленный ключ. В моих сценариях, автоматизирующих установку, я не проверяю, был ли ключ уже добавлен, но я проверяю, был ли репозиторий уже добавлен. Если хранилище не было добавлено, я добавляю его вместе с обновленным ключом, который я всегда загружаю с его URL.
Я изменяю саму команду, чтобы использовать пакетный режим, чтобы она не жаловалась на стандартный вывод. Для большего apt-ключа это будет работать, быстро протестировано на Debian:
sed -i "s%{GPG_EXE}\")' --%{GPG_EXE}\")' --batch --%g" /usr/bin/apt-key
Хотя для меньшего apt-ключа это может сработать (не проверено, так как я не могу точно вспомнить, где я видел этот более простой вариант):
sed -i 's%GPG_CMD="gpg %GPG_CMD="gpg --batch %g' /usr/bin/apt-key
Вам нужны привилегии для записи в /usr/bin/apt-key, поэтому либо работайте от имени пользователя root, либо используйте sudo
Это работает
apt-key exportall > test.key 2>/dev/null
или же
apt-key exportall 2>&1 | grep -v '^Warning' > test.key
Или также вы можете сделать так
RUN curl -sS http://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - &&\
echo "deb http://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
вместо
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list