我希望以下命令能够提取 gpg 文件而不询问密码:
gpg --passphrase 1234 file.gpg
但它要求输入密码。为什么?
这也有相同的行为:
gpg --passphrase-file passfile.txt file.gpg
我使用 Ubuntu 和 gnome 3,记得它在 Fedora 中运行
答案1
我和你的情况完全一样(它可以在 Fedora 上运行,但不能在 Ubuntu 上运行)。这是我发现的一个明显的解决方法:
echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg
说明:传递0
导致--passphrase-fd
从 STDIN 读取而不是从文件读取。因此,通过管道传递密码将--passphrase-fd
接受您指定的密码字符串。
答案2
2017年12月4日升级。 (添加--batch以防止密码提示)
您可能需要添加--batch
选项:
和。如果你使用接收者密钥对您可能还需要添加--pinentry-mode loopback
。
从版本 2 开始GPG
,需要该选项--batch
来确保没有提示...好吧,看看:
$ gpg --version
gpg (GnuPG) 2.1.18
libgcrypt 1.7.6-beta
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /home/user /.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2
试:
$ newdir=$(mktemp -d)
$ cd $newdir
$ seq 1 10 | gpg -c --batch --passphrase 1234 -o file.gpg -
$ ls -ltr
total 4
-rw-r--r-- 1 user user 91 Dec 4 15:42 file.gpg
$ hd file.gpg
00000000 8c 0d 04 07 03 02 ea fa d0 d3 2b 9a ea 06 df d2 |..........+.....|
00000010 4a 01 ed 50 74 ff 27 45 0e 6c 94 74 db e9 8a a5 |J..Pt.'E.l.t....|
00000020 03 9f 67 a0 73 97 e9 15 6b 56 a0 f0 88 71 85 a8 |..g.s...kV...q..|
00000030 dc 41 71 9f fa 3b f9 9d af ac 80 eb f4 f7 28 19 |.Aq..;........(.|
00000040 9f be 75 47 e6 d8 00 3e f6 60 f1 00 5e 63 57 ef |..uG...>.`..^cW.|
00000050 14 c3 4b 20 ff 94 03 03 c1 fc 98 |..K .......|
0000005b
听起来不错!现在好了:
$ gpg -d --batch --passphrase 1234 file.gpg
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
1
2
3
4
5
6
7
8
9
10
如果没有-d
给出参数(与SO的问题相同的语法),解密的数据file.gpg
将被提取到一个新的file
:
$ gpg --batch --passphrase 1234 file.gpg
gpg: WARNING: no command supplied. Trying to guess what you mean ...
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
$ ls -ltr
total 8
-rw-r--r-- 1 user user 91 Dec 4 15:42 file.gpg
-rw-r--r-- 1 user user 21 Dec 4 15:44 file
$ cat file
1
2
3
4
5
6
7
8
9
10
这个效果很好!
$ cd -
$ rm -fR $newdir
$ unset newdir
完整样本收件人密钥文件:
首先创建一个临时环境
newdir=$(mktemp -d)
cd $newdir
export GNUPGHOME=$newdir
echo YourPassword >password.txt
gpgconf --kill gpg-agent # Required, if agent_genkey fail...
gpg --generate-key --batch <<eoGpgConf
%echo Started!
Key-Type: default
Key-Length: default
Subkey-Type: default
Name-Real: Full Name There
Name-Comment: Something funny
Name-Email: [email protected]
Expire-Date: 0
Passphrase: $(<password.txt)
%commit
%echo Done.
eoGpgConf
gpg: keybox '/tmp/tmp.xU5Ldyr4iB/pubring.kbx' created
gpg: Started!
gpg: agent_genkey failed: No such file or directory
gpg: key generation failed: No such file or directory
gpg: Done.
唔。
gpgconf --kill gpg-agent
gpg --generate-key --batch <<eoGpgConf
%echo Started!
...
eoGpgConf
gpg: Started!
gpg: key 43E6B96CAFABDEDF marked as ultimately trusted
gpg: directory '/tmp/tmp.xU5Ldyr4iB/openpgp-revocs.d' created
gpg: revocation certificate stored as '/tmp/tmp.xU5Ldyr4iB/openpgp-revocs.d/DF223E1612CF917DC3BD42AA43E6B96CAFABDEDF.rev'
gpg: Done.
获取密钥 ID
那么现在
gpg -k
/tmp/tmp.xU5Ldyr4iB/pubring.kbx
-------------------------------
pub rsa3072 2020-06-19 [SC]
DF223E1612CF917DC3BD42AA43E6B96CAFABDEDF
uid [ultimate] Full Name There (Something funny) <[email protected]>
sub rsa3072 2020-06-19 [E]
(pub 指纹中的最后 8 个字符可以用作密钥别名。)
gpg -k [email protected]| sed -e '/^pub/{N;s/.*\(.\{16\}\)/\1/;p;s/^.\{8\}//;q};d'
43E6B96CAFABDEDF
AFABDEDF
或者甚至检索到巴什变量,使用--with-colons
.
while IFS=: read -r typeOfRec _ _ _ keyId _; do
case $typeOfRec in pub ) break ;; esac
done < <(gpg --with-colons -k [email protected] )
declare -p keyId
declare -- keyId="43E6B96CAFABDEDF"
加密
现在可以!
seq -f "%'8g" 990 5 1015 |
gpg --batch --armor --recipient "$keyId" --encrypt --output file.gpg
会给出类似的东西:
cat file.gpg
-----BEGIN PGP MESSAGE-----
hQEOA5BNpEVKPGsfEAP/XutJp7ME3I1MqG0vZyIS8w+npPQMPicIpQUwM4OVO1rX
2lhrymp0zGqxAH7s9Dh9YJNRA/9zYCO4/vghtnnl/zg10vILs9btgLXY+aupgoQ9
nifnVC8JJ1DC+hZZrIHyzS73BsjufWhpbwURYc7EgIMGKu2TRiy5I8+0aZ4zAtID
/ApL0sTBQ9hqmIatzaYbX9ajmDf1vvtE2/s3MUFA/hIqew2MVMhlb4RjyT7ix03P
LmCH2Mfy88VGr59eSUoZq+CPMDSZpXxbE2LfyPHYsObraO+a6FdVHhj2xcw/tnDO
TcNHTKnTRJSb9sfLAtJmE9eaxebkl27T+UvqyJUG4dgu0lABadboNaEidlrCYLNi
icR19UX0G7E50+i3iKvw0u81YtciYyOnpHvgazb5QbqJNN5P8izC4J3FqW7HaTDI
xnf+8IaX2Vqrq5+k4qLR7h5Vcw==
=1fb5
-----END PGP MESSAGE-----
注意:不再需要>=2.2
以下版本:gpg``--batch
seq -f "%'8g" 990 5 1015 |
gpg -aer "$keyId" >file.gpg
会起到几乎相同的效果。
解密
然后
gpg --decrypt --pinentry-mode loopback --passphrase-file password.txt --batch file.gpg
或者
gpg -d --pinentry-mode loopback --passphrase-file password.txt --batch file.gpg
将产生:
gpg: encrypted with 3072-bit RSA key, ID 58020687E0746339, created 2020-06-19
"Full Name There (Something funny) <[email protected]>"
990
995
1'000
1'005
1'010
1'015
但是,从>=2.2
的版本开始gpg
,您可以使用:
gpg -qd --passphrase "$(<password.txt)" file.gpg
990
995
1'000
1'005
1'010
1'015
答案3
对于 gpg 2.x 版本,您不需要使用--batch
,只需
--pinentry-mode loopback
--passphrase
与&一起使用--passphrase-file
,并让您输入新信息,以防文件名冲突,例如:
gpg --pinentry-mode loopback --passphrase-file=file encrypted.gpg
...
File 'encrypted' exists. Overwrite? (y/N)n
Enter new filename: f2
不像--batch
那样很快就会失败,说...failed: File exists
(在 Debian Stable/Stretch 的 gpg 2.1.18 上进行了测试。这种忽略重要选项的行为--passphrase
确实应该是一个错误,如果还没有的话)
答案4
如果使用 gpg (GnuPG) 2.2.7 根据手册页,
--passphrase-fd n
从文件描述符 n 中读取密码。仅从文件描述符 n 中读取第一行。如果您使用 0 作为 n,则将从 STDIN 读取密码。仅当仅提供一个密码短语时才能使用此选项。
--passphrase-file 文件
从文件 file 中读取密码。仅从文件 file 中读取第一行。仅当仅提供一个密码短语时才能使用此选项。显然,如果其他用户可以读取该文件,则存储在文件中的密码的安全性值得怀疑。如果可以避免,请不要使用此选项。
--密码字符串
使用字符串作为密码。仅当仅提供一个密码短语时才能使用此选项。显然,这在多用户系统上的安全性非常值得怀疑。如果可以避免,请不要使用此选项。
添加--pinentry-mode loopback
以便工作
请注意,自版本 2.0 起,仅当也给出了选项 --batch 时才使用此密码。从版本 2.1 开始,--pinentry-mode 也需要设置为环回。
例如:
gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in