我已经搜索了好几天,但到目前为止还没有找到。也许我搜索的关键字不对。
我需要使用 GPG 来解密加密内存中的文件,而无需将解密的内容写入磁盘。
第三方软件将调用脚本 shell,提供加密内容和stdin
密码作为参数。仅出于测试目的,我读取了一个 shell 变量
read pass
然后我输入了我的密码。
echo $pass | gpg --passphrase-fd 0 --no-comment -q --no-verbose --decrypt fichier.chiffre.armor.gpg
这产生
You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)
message secret
我只希望获得message secret
,而不是与解密相关的先前的文本。
如果我调用echo $pass | gpg --passphrase-fd 0 --no-comment -q --no-verbose --output decrypted.txt --decrypt fichier.chiffre.armor.gpg
文件decrypted.txt
仅包含message secret
我尝试使用/dev/stdout
as --output
参数,但是失败了。
echo $pass | gpg --passphrase-fd 0 --no-comment -q --no-verbose --output /dev/stdout --decrypt fichier.chiffre.armor.gpg
You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)
File `/dev/stdout' exists. Overwrite? (y/N)
关于如何仅使用 GPG 来实现这一点,您有什么想法吗?
谢谢,塞巴斯蒂安
答案1
我的 gpg 似乎没有输出与您的类似的信息消息,尤其是-q
,但无论如何,如果如您所说,唯一的问题是您从 stderr 获得了额外的消息,您可以通过将其添加到您的命令中来消除它们(通过将 stderr 重定向到 /dev/null):
2>/dev/null
您可以重新使用 stdout,而不必担心安全擦除任何包含解密信息的临时文件。
[此外,--pinentry-mode loopback
可能有助于避免某些提示]
答案2
实际上
You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)
没有写上stdout
。
当通过管道传输原始命令以sed 1,5d
希望删除前 5 行时,它只会删除明文消息。
通过将输出重定向到文件,我们得到了我们需要的东西:
myself@myhost:~/gpg$ echo $pass | gpg --passphrase-fd 0 --no-comment -q --no-verbose --decrypt fichier.chiffre.armor.gpg > toto.txt
You need a passphrase to unlock the secret key for
user: "Myself <[email protected]>"
2048-bit RSA key, ID 5F65F788, created 2019-02-22 (main key ID C7E00AC4)
myself@myhost:~/gpg$ cat toto.txt
message secret
stdout
我对屏幕上所写的内容感到困惑。