lfa*_*fam 3 unix encryption shell command-line gnupg
我正在尝试找出一种方法来更改由 GPG 对称加密的文件的密码,而无需使用临时文件或 shell 变量。我知道我可以在带有变量的 shell 函数中执行此操作,但如果可能的话,我想在命令行上执行此操作。
我认为这应该是可能的,因为 GPG 会使用 加密传入的流,gpg --symmetric -o example.gpg并且因为 GPG 会使用 将解密的输出发送到 STDOUT gpg --decrypt。
但这不能正常工作:
gpg --decrypt example.gpg | gpg --symmetric -o new.gpg
Run Code Online (Sandbox Code Playgroud)
我认为我对 shell 操作顺序和重定向的理解是错误的。Enter passphrase:特别是因为 shell 输出一次有多个提示。
以下是输入管道命令后的初始交互响应:
localhost ~% gpg --decrypt example.gpg | gpg --symmetric -o example.gpg
gpg: CAST5 encrypted data
Enter passphrase: Enter passphrase
Run Code Online (Sandbox Code Playgroud)
之后,我会收到各种密码提示...有时会要求我输入解密密码,然后我可以以可见的纯文本形式输入新密码,然后输入隐藏的新密码确认。有时,在要求我提供解密密码之前,我会收到新密码对话框。
我认为存在竞争条件。
有什么建议吗?
您需要以非交互方式告诉第一个 gpg 命令解密密码是什么。
对于 gpg2(大多数现代 Linux 发行版都附带这个),它可能看起来像这样:
gpg --decrypt --batch --passphrase 'original passwd' example.gpg | gpg --symmetric -o new_example.gpg
Run Code Online (Sandbox Code Playgroud)对于 gpg1,您可以使用--no-use-agent代替--batch,例如:
gpg -d --no-use-agent --passphrase 'original passwd' example.gpg | gpg -co new_example.gpg
Run Code Online (Sandbox Code Playgroud)注意:根据您的 gpg 版本及其配置方式,您可能还必须以相同的方式为第二个 gpg 命令指定密码。
当您将命令行与管道放在一起时,您的 shell 在设置连接每个命令的管道后会同时启动所有命令(以允许stdout将每个命令发送到stdin下一个命令)。
不要写入您正在读取的同一个文件。它几乎永远不会如你所愿。
在多用户系统上,使用 gpg--passphrase选项不是一个好主意,因为它使系统上的任何人都可以检查密码(任何人都可以运行命令并在命令运行ps时查看密码)。gpg此外,密码还会保存在您的 shell 历史记录中。哎呀。如果有问题,请使用--passphrase-fd或--passphrase-file。