我想在不需要用户交互的情况下使用GnuPG的decrypt
命令。脚本的--passphrase-fd
参数似乎正是我所需的。但我不知道它如何工作-没有找到示例。
请问有人能给我一个这样的命令示例,包括Windows和UNIX环境吗?
(FYI,我正在使用GnuPG 2)。
谢谢 :)
我想在不需要用户交互的情况下使用GnuPG的decrypt
命令。脚本的--passphrase-fd
参数似乎正是我所需的。但我不知道它如何工作-没有找到示例。
请问有人能给我一个这样的命令示例,包括Windows和UNIX环境吗?
(FYI,我正在使用GnuPG 2)。
谢谢 :)
--passphrase-fd
,您必须指定--batch
参数。我将首先解释--passphrase-fd
的工作原理,然后再讲解示例。
--passphrase-fd
告诉GnuPG应该从哪个文件描述符(-fd)中获取密码。标准文件描述符是STDIN(0)、STDOUT(1)和STDERR(2)。对于这个问题的上下文,您通常只需要关注STDIN(0)。--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...
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
参数。type
替换cat
以将文件内容转储到STDIN。kylehuff的答案对我仍然无效,gpupg仍会弹出密码提示。
根据https://wiki.archlinux.org/index.php/GnuPG#Unattended_passphrase所述,如果使用gnupg 2.1.0及更高版本,则需要执行其他步骤才能支持--passphrase-fd
参数。
First, edit the gpg-agent configuration to allow loopback pinentry mode: ~/.gnupg/gpg-agent.conf
allow-loopback-pinentry
Restart the gpg-agent process if it is running to let the change take effect.
Second, either the application needs to be updated to include a commandline parameter to use loopback mode like so:
$ gpg --pinentry-mode loopback ...
allow-loopback-pinentry
实际上默认已启用。不确定为什么 Arch Wiki 如此明确地提到它。来源:https://www.gnupg.org/documentation/manuals/gnupg/Agent-Options.html - jlh使用GPG4win/gpg 2.2.3:要使用passphrase-fd 0
并绕过提示,我可以确认以下操作是有效的:
--pinentry-mode loopback
作为最近自己不得不弄清楚这个问题的人,我认为值得略微介入。
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}>&-
diff
检查之前,您会发现第一个加密数据块吞掉了密码短语,导致下面两个数据块没有有效的密码短语。此操作中的相关脚本为:首先,script_decrypt.sh构建脚本将测试密钥的密码短语设置为文件描述符9
,如上面的示例所示,然后调用Helper script,使其利用该文件描述符……这是一个有趣的用例,但故事的寓意似乎是,您计划使用GnuPG文件描述符进行的任何大量解密操作都可能需要按照以上步骤作为整个函数来正确重新打开文件描述符。在未来的几次推送中,我将重写助手脚本,因此请检查大于152
的Travis-CI构建日志,以查找文件描述符关闭的解决方案……
echo "mypassphrase" | gpg2 --batch --passphrase-fd 0
通过从文件描述符中读取口令来提高安全性的目的被破坏了,如果echo
是一个独立的命令,因为这样口令又成为了公共命令行参数的一部分。最好使用<<<
运算符来防止任何意外的密码泄漏。 - ceving--passphrase-fd 0
时,如何通过命令行提供要加密的内容? - sunknudsen