即使使用 --passphrase,gpg 也会要求输入密码

Omi*_*mid 93 shell-script gpg

我希望以下命令可以在不要求密码的情况下提取 gpg 文件:

  gpg --passphrase 1234 file.gpg
Run Code Online (Sandbox Code Playgroud)

但它要求输入密码。为什么?

这也有相同的行为:

  gpg --passphrase-file passfile.txt file.gpg
Run Code Online (Sandbox Code Playgroud)

我将 Ubuntu 与 gnome 3 一起使用,并记住它在 Fedora 中运行

jon*_*S90 77

我和你完全一样(它在 Fedora 上工作,但在 Ubuntu 上不工作)。这是我发现的一个明显的工作:

echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg
Run Code Online (Sandbox Code Playgroud)

说明:传递0导致--passphrase-fd从 STDIN 读取而不是从文件读取。因此,通过管道--passphrase-fd传递密码将接受您指定的密码字符串。

  • 在上面添加`--batch --yes`对我有用。 (21认同)
  • 我在此处(在 gpg (GnuPG) 2.1.18 上)使用和不使用 `--batch` 时收到“不适当的设备 ioctl”。 (4认同)
  • 这对我有用`cat your-passphrase-file.txt | gpg --pinentry-mode loopback --passphrase-fd 0 --sign your-file-to-sign.txt` (4认同)
  • 好吧,使用 gpg 的 Ubuntu 版本,`echo “加密我” | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpg` 似乎工作。 (2认同)
  • @RyanGriggs 我不这么认为。`回声“你好” | cat` 和 `echo "hello"| cat` 都产生相同的字符串。 (2认同)
  • 您的解决方案适用于 gpg 1.x,但请为 gpg 2.x 添加 `--pinentry-mode Loopback`。 (2认同)

F. *_*uri 53

2017-12-04 升级。(添加 --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
Run Code Online (Sandbox Code Playgroud)

试:

$ 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
Run Code Online (Sandbox Code Playgroud)

听起来不错!现在好了:

$ 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
Run Code Online (Sandbox Code Playgroud)

虽然没有-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
Run Code Online (Sandbox Code Playgroud)

这工作得很好!

$ cd -
$ rm -fR $newdir
$ unset newdir
Run Code Online (Sandbox Code Playgroud)

对于收件人密钥文件

第一个干净的节奏创作

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: user@example.com
    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.
Run Code Online (Sandbox Code Playgroud)

唔。

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.
Run Code Online (Sandbox Code Playgroud)

那么现在

gpg -k
/tmp/tmp.xU5Ldyr4iB/pubring.kbx
-------------------------------
pub   rsa3072 2020-06-19 [SC]
      DF223E1612CF917DC3BD42AA43E6B96CAFABDEDF
uid           [ultimate] Full Name There (Something funny) <user@example.com>
sub   rsa3072 2020-06-19 [E]
Run Code Online (Sandbox Code Playgroud)

然后来自 pub 指纹的最后 8 个字符可以用作密钥别名。

gpg -k user@example.com| sed -e '/^pub/{N;s/.*\(.\{16\}\)/\1/;p;s/^.\{8\}//;q};d' 
43E6B96CAFABDEDF
AFABDEDF
Run Code Online (Sandbox Code Playgroud)

现在可以!

seq -f %\'8g 990 5 1015 |
    gpg --batch --armor --recipient AFABDEDF --encrypt --output file.gpg
Run Code Online (Sandbox Code Playgroud)

或者

seq -f %\'8g 990 5 1015 | gpg --batch -aer 43E6B96CAFABDEDF -o file.gpg 
Run Code Online (Sandbox Code Playgroud)

会给:

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-----
Run Code Online (Sandbox Code Playgroud)

然后

gpg --decrypt --pinentry-mode loopback --passphrase-file password.txt --batch file.gpg
Run Code Online (Sandbox Code Playgroud)

或者

gpg -d --pinentry-mode loopback --passphrase-file password.txt --batch file.gpg
Run Code Online (Sandbox Code Playgroud)

将呈现:

gpg: encrypted with 3072-bit RSA key, ID 58020687E0746339, created 2020-06-19
      "Full Name There (Something funny) <user@example.com>"
     990
     995
   1'000
   1'005
   1'010
   1'015
Run Code Online (Sandbox Code Playgroud)

  • 请参阅下面的答案。关键是`--pinentry-mode loopback`。有用! (3认同)

Xen*_*050 40

对于 gpg 2.x 版,您不需要使用--batch,只需

--pinentry-mode loopback  
Run Code Online (Sandbox Code Playgroud)

--passphrase& 一起使用--passphrase-file,并允许您输入新信息,以防文件名冲突,例如:

gpg --pinentry-mode loopback --passphrase-file=file encrypted.gpg

...
File 'encrypted' exists. Overwrite? (y/N)n
Enter new filename: f2
Run Code Online (Sandbox Code Playgroud)

不像--batch那样会很快失败,说...failed: File exists

(在 Debian Stable/Stretch 的 gpg 2.1.18 上测试过。这种忽略重要--passphrase选项的行为确实应该是一个错误,如果它还没有的话)

  • 这也适用于带有 gpg (GnuPG) 2.2.4 的 Ubuntu 18.04 Bionic (2认同)
  • 这对我有用 `cat your-passphrase-file.txt | gpg --pinentry-mode 环回 --passphrase-fd 0 --sign your-file-to-sign.txt` (2认同)

rsa*_*saw 17

听起来您正在使用 gpg2。您还需要加入--batch选项。(如果您打算将其添加到脚本中,您--no-tty可能还想添加--yes。)

  • 是 1.4。使用 --batch 没有效果。 (3认同)

小智 11

如果使用 gpg (GnuPG) 2.2.7 根据手册页,

--passphrase-fd n

从文件描述符 n 中读取密码。只有第一行将从文件描述符 n 中读取。如果 n 使用 0,将从 STDIN 读取密码。这只能在仅提供一个密码短语时使用。

--密码文件文件

从文件 file 中读取密码。只会从文件 file 中读取第一行。这只能在仅提供一个密码短语时使用。显然,如果其他用户可以读取此文件,则存储在文件中的密码的安全性值得怀疑。如果可以避免,请不要使用此选项。

--密码字符串

使用字符串作为密码。这只能在仅提供一个密码短语时使用。显然,这在多用户系统上的安全性非常值得怀疑。如果可以避免,请不要使用此选项。

添加--pinentry-mode loopback以便工作

请注意,从 2.0 版开始,只有在还提供了选项 --batch 时才使用此密码。从 2.1 版开始,还需要将 --pinentry-mode 设置为环回。

例如:

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in
Run Code Online (Sandbox Code Playgroud)


小智 10

对我来说,添加“--no-use-agent”为“gpg (GnuPG) 1.4.16”解决了这个问题:

date > foo
echo pass > passphrase
# w/o --no-use-agent
> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --symmetric foo
gpg: gpg-agent is not available in this session
gpg: can't query passphrase in batch mode
gpg: error creating passphrase: invalid passphrase
gpg: symmetric encryption of `foo' failed: invalid passphrase


> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --no-use-agent --symmetric foo
> ls -al
total 20
drwxr-xr-x  2 root root 4096 Aug 22 13:59 .
drwx------ 18 root root 4096 Aug 22 13:58 ..
-rw-r--r--  1 root root   30 Aug 22 13:58 foo
-rw-r--r--  1 root root  103 Aug 22 13:59 foo.gpg
-rw-r--r--  1 root root    5 Aug 22 13:58 passphrase
Run Code Online (Sandbox Code Playgroud)


小智 6

它对我来说就像魔法一样:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp
Run Code Online (Sandbox Code Playgroud)


jas*_*as- 5

read -sp "Enter passphrase: " pass
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --symmetric -o /path/to/saved/file.jpg.gpg /path/to/file.jpg
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --decrypt -o /path/to/decrypted/file.jpg /path/to/encrypted/file.jpg.gpg
Run Code Online (Sandbox Code Playgroud)