当找不到 --default-key 时,如何防止 gpg 选择后备密钥?

How to prevent gpg from choosing fallback secret key, when --default-key is not found?

我正在从 (Perl, bash) 脚本中调用以下命令:

gpg --batch --yes --default-key C0FFEEABCDEF0123 --clearsign some_file.txt

但是我的钥匙串中不存在该密钥 (C0FFEEABCDEF0123),因为打字错误或密钥丢失,所以 gpg 无法使用该密钥进行签名。

发生这种情况时,gpg 在钥匙串中查找,找到 "default default" 密钥(意思是它会在没有 --default-key 的情况下选择的那个)并尝试用那个密钥签名。

这会导致出现密码提示,这会暂停脚本,因为该密钥已加密。 (我期待一个未加密的,因为这是一个玩具原型。)

如果找不到指定的密钥,如何让 gpg 放弃?

如果密钥被加密,没有密码就不能使用,如何让它放弃?

How do I make gpg give up if it can't find the specified key?

gpg --batch --yes -u C0FFEEABCDEF0123 --clearsign some_file.txt

gpg: skipped "C0FFEEABCDEF0123": No secret key
gpg: some_file.txt: clear-sign failed: No secret key

How do I make it give up if the key is encrypted and it can't be used without a password?

你可以use the --passphrase-fd --pinentry-mode loopback arguments to provide an empty password (or perhaps change the pinentry program?)。

echo ""|gpg -q --batch --yes -u C0FFEEABCDEF0123 --textmode --passphrase-fd 0 --pinentry-mode loopback --clearsign some_file.txt

gpg: signing failed: No passphrase given
gpg: some_file.txt: clear-sign failed: No passphrase given

要在 Windows 上执行此操作(无管道):

@echo off > pass.txt && @echo on && gpg -q --batch --yes -u C0FFEEABCDEF0123 --textmode --passphrase-file pass.txt --pinentry-mode loopback --clearsign some_file.txt & del /q pass.txt

如果你不介意一些python(很适合编写脚本)。

process = subprocess.Popen(
    "gpg --batch --yes --default-key C0FFEEABCDEF0123 --clearsign some_file.txt",
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    stdin=subprocess.PIPE)
process.communicate(input="")
if process.returncode == 0:
    # mb return 0
else:
    # mb return -1