33

I would like to use GnuPG´s decrypt command without any user interation. The script's --passphrase-fd argument seems exactly what I need. But I don't know how it works - haven't found examples.

Could anyone give me an example of such a command, on both Windows and UNIX environments?

(FYI, I'm using GnuPG 2).

Thanks already :)

4

4 回答 4

48

为了--passphrase-fd在 GnuPG v2 中使用 gpg 选项,您必须指定--batch参数。我将首先解释其--passphrase-fd工作原理,然后介绍示例。

--passphrase-fd告诉 GnuPG期望密码来自哪个文件描述符(-fd)。标准文件描述符是 STDIN (0)、STDOUT (1) 和 STDERR (2)。对于这个问题的上下文,您通常只关心 STDIN (0)。

您没有指定密码的来源,因此我将以各种方式演示 STDIN(标准输入)的用法。

--passphrase-fd 0告诉 GnuPG 从当前 shell 的输入中检索密码;因此,例如,如果您希望 GnuPG 在控制台输入的下一行中获取密码数据,则命令和输出将如下所示:

gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
<next line of input is passphrase followed by hitting enter>
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

在上面的示例中,密码短语是通过文件描述符 0 (STDIN) 提供的——我们通过在 shell 当前标准输入中输入它来提供。

在下一个示例中,我们将告诉 GnuPG 从当前 shell 的输入中检索密码短语,该密码实际上是另一个命令的输出(在这种情况下,它只是“回显”你告诉它的内容):

echo "mypassphrase" | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

另一个将包含密码短语的文件内容转储到 STDIN 的示例 -

cat /path/to/file_with_passphrase | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

总之,--passphrase-fd只需告诉 GnuPG 你想通过标准文件描述符向它提供必要的密码;GnuPG v2 和 GnuPG 之间的区别仅仅是--batch参数。

上面的例子在 Windows 和 *nix 环境中应该是一样的,唯一的区别是在 Windows 中——取决于你的配置和版本——你必须替换cattype以便将文件的内容转储到 STDIN。

于 2014-01-08T21:54:28.723 回答
24

kylehuff 的回答仍然对我不起作用,gpupg 仍然会弹出密码提示。

根据https://wiki.archlinux.org/index.php/GnuPG#Unattended_pa ​​ssphrase 与 gnupg 版本 2.1.0 及更高版本,您需要做额外的步骤来支持--passphrase-fd

首先,编辑 gpg-agent 配置以允许回送 pinentry 模式:~/.gnupg/gpg-agent.conf

allow-loopback-pinentry

如果 gpg-agent 进程正在运行,请重新启动它以使更改生效。

其次,需要更新应用程序以包含命令行参数以使用环回模式,如下所示:

$ gpg --pinentry-mode loopback ...
于 2016-07-08T02:44:27.227 回答
6

Using GPG4win/gpg 2.2.3: to use passphrase-fd 0and bypass the prompt,我可以确认以下工作:

--pinentry-mode loopback
于 2017-12-06T19:32:29.323 回答
3

因为我最近不得不自己弄清楚这一点,所以我认为这可能值得一试。

如果您正在解密文件,kylehuff 的答案非常好,但是,如果您需要输入/输出重定向,例如管道,这里有一个使用非0文件描述符传递密码的示例。

#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass_location="/path/to/passphrase.file"
Var_gpg_decrypt_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
exec ${Var_fd}<${Var_pass_location}
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_decrypt_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-

请注意,在特殊用例之外,保存您的私钥密码通常被视为一个坏主意或不好的安全做法。-另外,请不要忘记在完成后关闭描述符,这样您的密码就无法再通过该方法访问了。- 我经常在这些用例中看到建议使用专门的非密码保护密钥,但这完全是您的选择. 如果您喜欢上面的代码,那么您可能还想检查我为无人值守或有人值守的密钥生成而调试的脚本,因为它涵盖了更不常用的 gpg 文件描述符选项。

编辑/更新

所以我一直在调试批量解密操作,并且有证据表明文件描述符似乎自动关闭,或者它可能是由 GnuPG 自动关闭的。一直检查原始日志底部的build 152diff ,就在检查之前,您会发现第一个加密数据块吃掉了密码,而接下来的两个数据块没有有效的密码。此操作中的相关脚本是;首先script_decrypt.sh构建脚本将测试密钥的密码设置为文件描述符9,如上例所示,然后是Helper 脚本被称为这样它会使用该文件描述符......这是一个时髦的用例,但故事的寓意似乎是,您计划使用 GnuPG 文件描述符实现的任何批量解密操作都可能需要遵循上述步骤作为一个整体功能正确地重新打开文件描述符。我将在接下来的几次推送中重写帮助程序脚本,因此检查Travis-CI构建日志是否大于152找到我是否有解决文件描述符关闭位置的解决方案......

...因此只需要两次尝试就可以使事情正常进行,请查看构建154中加密文件和原始输入日志匹配的差异。正如假设的那样,文件描述符在 GnuPG 或子 shell 首次使用后被转储,因此需要在每个解密命令之前分配密码以进行批量解密。

希望这对你们都很有价值。

于 2016-11-05T07:53:04.077 回答