我的任务是解释我的一个批处理脚本中发生的 gpg 错误的变化。目前,当我对指定文件执行 gpg 解密时,它返回 2。问题是当我搜索表单时,它显示该文件已正确解密,但错误代码导致脚本停止,因为它只假设 0是唯一的成功价值。
gpg -o XXX --decrypt XXX.gpg
RETVAL=$?
if [ RETVAL -ne 0 ]; then
exit 1
fi
我在网上搜索并找到了 gpg 的标头列表。它将错误 2 定义为未知数据包。
显示的正常错误文本是 [gpg: [不知道]: 无效数据包 (ctb=14)]。未知数据包到底意味着什么?我正在尝试搜索任何有关理解错误代码的文档。使用 [-vv] 选项显示所有详细信息后。我将生成的 gpg 文件解密与返回 0 代码的文件进行了比较。我唯一注意到的是密钥的字节不同。
无错误的 gpg 解密有以下日志:
:pubkey enc packet: version 3, algo 16, keyid <16-hexdigit>
data 1023 bits
data 1024 bits
gpg 解密导致错误,日志如下:
:pubkey enc packet: version 3, algo 16, keyid <16-hexdigit>
data 1022 bits
data 1022 bits
这是什么意思?为什么密钥位不相同仍能正确解密?请注意,用于解密这两个文件的密钥 ID 和密码是相同的。另外,有谁知道解释 gpg.dll 错误的详细资源吗?
答案1
广泛使用的 GPF 代码分为三种类型:
- 0 表示成功(所有其他值表示失败)。
- 2 通常用于意外错误。
- 1 对于诸如 BAD 签名之类的事情。
--status-fd <file descriptor>
识别错误的正确方法是解释or的输出--status-file <filename>
。
现在,对于您正在使用的特定问题,可能有两个原因:
- GPG 询问您是否要继续使用未签名密钥进行加密。由于没有用户可以输入 Y,因此会产生错误。
要解决此问题,请提供以下开关:
--yes and --always-trust
- 也可能是权限问题。 gpg 正在尝试访问它无法访问的目录,因此失败并出现致命错误。 (错误代码2)
您可以通过指定一个 homedir 指令以及 gpg 可写的目录来解决这个问题。像这样:
$cmd = "/usr/bin/gpg -a --recipient $to -e -o $outfile $infile --homedir /path/to/dir";
来自 man gpg 的信息:
--homedir directory
Set the name of the home directory to directory
If this option is not used it defaults to "~/.gnupg". It does not make sense to use this in a options file. This also overrides the environment variable $GNUPGHOME.
您也可以使用这个关联了解更多有关此的信息。
答案2
在linux中使用status-fd的一种方法如下:
GPG="${PGP_LOCATION}gpg --status-fd 2 --passphrase-fd 0 --no-verbose --batch --output ${OUTPUT} --decrypt ${DOUTPUT}"
echo "GPG:${GPG}"
${GPG} 2>&1 >> ${STATUS} < ${PASSFILE}
请注意,所有 shell 变量都设置为指向正确的值。 gpg 的输出被捕获在${STATUS}
(一个文件)...