如何规避"apt-key output should not be parsed"?

How to circumvent "apt-key output should not be parsed"?

我正在自动化我的 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 的旧版本中运行良好,但最新版本有两个问题:

  1. 一种不同的输出格式:我可以绕过它
  2. 警告:

    Warning: apt-key output should not be parsed (stdout is not a terminal)
    

显然,我也可以解决这个问题,只需将 stderr 重定向到 /dev/null。这让我很好奇:

这些优秀的人如何建议我验证我的密钥指纹?或者我想自动化它是不是从根本上错了,这是否违背了重点? (我认为不是,因为我仍然手动从网站上提取预期的指纹,但请随时告诉我其他情况...)

从 apt-key 来源,您可以将 APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE 设置为 non-empty 值以禁用此警告。

您也可以使用 "grep -q",因此您也不需要在 /dev/null 中重定向标准输出。

回复"am I getting this fundamentally wrong"部分:

我相信可能是的。这就是警告的原因。

你不会写下你所做的事情,但要意识到的一件事是:

密钥确实有一些过期时间,因此一段时间后脚本中的指纹将过时并且可能不再按预期运行。

安装存储库及其密钥后,系统会以某种方式自动升级密钥,但是在最初添加存储库时,必须提供最新的密钥。在我的自动安装脚本中,我不测试是否已添加密钥,但我测试是否已添加存储库。如果未添加存储库,那么我将其与我始终从其 URL.

下载的最新密钥一起添加

我正在修改命令本身以使用批处理模式,这样它就不会抱怨 stdout。对于更大的 apt-key 这将起作用,在 debian 上快速测试:

sed -i "s%{GPG_EXE}\")' --%{GPG_EXE}\")' --batch --%g" /usr/bin/apt-key

虽然对于较小的 apt-key 这可能有效(未经测试,因为我不记得我在哪里看到过这个更简单的变体):

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