有没有办法在脚本中动态获取加密(GPG)文件?

有没有办法在脚本中动态获取加密(GPG)文件?

我需要一个 bash 脚本来获取加密的文件,因为获取的文件包含敏感信息。

我希望脚本提示输入 GPG 密码,然后运行,获取加密文件。但我不知道该怎么做。必须有用户输入密码,因为我不想将密钥与加密文件一起存储在服务器上。

研究一些不同的方法,我不想解密文件,获取非加密文件,然后删除它。如果脚本中出现问题,我想减少留下未加密文件的机会。

有没有办法以这种方式获取文件的 GPG 输出?可能收集 STDOUT 并解析它(如果 GPG 甚至可以通过这种方式输出内容)。

另外,如果有另一种方法来加密 shell 脚本可以使用的文件,我不知道,但对其他可能性持开放态度。

答案1

您可以使用以下方法执行此操作流程替代

. <(gpg -qd "$encrypted_filename")

这是一个例子:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r [email protected] to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -d不会将文件保存到磁盘,它只是将其输出到标准输出。<()使用一个先进先出,这也不会导致实际文件数据写入磁盘。

在 bash 中,.andsource是同义词,但.更便携(它是 POSIX 的一部分),所以我在这里使用了它。但请注意,这<()并不那么可移植——据我所知,它仅在 bash、zsh、ksh88 和 ksh93 中受支持。 pdksh 和 mksh 有协进程可以起到同样的效果。

答案2

如果您已gpg-agent正确设置,使用pinentry-tty或其他不会污染标准输入/标准输出的版本,那么您应该能够执行以下操作:

source <( gpg --decrypt file.gpg )

这使用进程替换将结果提供给就source好像它是一个文件一样。一旦 shell 处理完毕,特定的文件数据就会消失,但此后您仍然需要小心 shell 内存中的敏感数据。

答案3

由于已经给出了最理智的答案,这里有一个疯狂的答案 - 使用这个文件系统:

https://github.com/jseppanen/gpgfs

这样你的程序就不会注意到它正在与管道通信。

相关内容