如何使用 bash 检查 gpg 密钥是否已存在然后跳过下载/添加?

如何使用 bash 检查 gpg 密钥是否已存在然后跳过下载/添加?

所以基本上,我想运行这 2 个命令,但我想检查这些键是否已经存在。我知道如何在 bash 中执行 ifthenelse,但我不确定如何获取结果并将其存储在变量中以供我检查,以便我可以将其放入条件运算符中。例如,如果它已经存在,那么我可以跳过下载并再次添加它。

示例 1(--fetch-keys):

    sudo apt-key adv --fetch-keys https://packages.microsoft.com/keys/microsoft.asc
sudo tee /etc/apt/sources.list.d/vscode.list > /dev/null <<- END
    deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main
END

示例 2(--recv-keys):

    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B9A06DE3
sudo tee /etc/apt/sources.list.d/inkscape.list > /dev/null <<- END
    deb [arch=amd64] http://ppa.launchpad.net/inkscape.dev/stable-daily/ubuntu bionic main
END

答案1

那么类似这样的情况怎么样:

TEST=$(apt-key list 2> /dev/null | grep my_app_name)
if [[ ! $TEST ]]; then
    echo "Missing - need to run --fetch-keys or --recv-keys"
fi

我将 stderr 导入到空设备( 2> /dev/null )以隐藏在脚本中使用 apt-key 列表时收到的警告。

尝试单独运行“sudo apt-key list”,这样您就可以看到输出的样子,以防您想将“grep”更改为更具选择性。

答案2

您可以将每个密钥保存在其自己的文件中并测试该文件是否存在。

keyring=/etc/apt/trusted.gpg.d/inkscape.gpg
if [ ! -f $keyring ]; then
  sudo apt-key --keyring $keyring \
    adv --keyserver keyserver.ubuntu.com --recv-keys B9A06DE3
fi
sudo tee /etc/apt/sources.list.d/inkscape.list > /dev/null <<- END
deb [arch=amd64] http://ppa.launchpad.net/inkscape.dev/stable-daily/ubuntu bionic main
END

答案3

命令“apt-key list”可能不会列出您已有的所有密钥,在这种情况下“grep”不会通知您密钥的存在。

如果你使用“gpg --import”导入密钥,那么“gpg --list-keys”后跟 grep 会告知你该密钥是否存在。例如

gpg --list-keys | grep zoom 
if [[ $? -ne 0 ]]; then
  wget https://zoom.us/linux/download/pubkey?version=5-12-6
  gpg --import  pubkey?version=5-12-6
fi 

相关内容