有没有办法在脚本中即时获取加密的(GPG)文件?


8

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

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

考虑一些不同的方法,我不想解密文件,获取未加密的文件,然后再将其删除。如果脚本出现问题,我想减少留下未加密文件的机会。

有没有一种方法可以获取文件的GPG输出以这种方式获取源代码?可能收集STDOUT并进行解析(如果GPG甚至可以这种方式输出内容)。

另外,如果还有其他方法可以加密Shell脚本可以使用的文件,我也不知道,但是有其他可能。

Answers:


16

您可以使用流程替换来实现

. <(gpg -qd "$encrypted_filename")

这是一个例子:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r chris@chrisdown.name to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -d不会将文件持久保存到磁盘,而只是将其输出到stdout。<()使用FIFO,这也不会导致实际的文件数据写入磁盘。

在bash中,.source是同义词,但.更可移植(它是POSIX的一部分),因此在这里使用了它。但是请注意,这<()并不那么可移植-就我所知,仅bash,zsh,ksh88和ksh93支持。pdksh和mksh具有可以具有相同效果的协同进程。


这是一个非常好的解决方案。想到了一个命名管道,但不想对其进行管理。我不知道我可以这样做。
BriGuy 2015年

当然,如果您担心有人可以读取临时文件,则与此相关的担心与有人可以读取由创建的临时管道有关<(command)
Zan Lynx 2015年

@ZanLynx该问题明确指出这与磁盘上不存在有关。否则,安全地执行此操作的解决方案与其他任何地方都相同:使用仅由您控制的用户,并在只有root用户的系统上进行操作。
克里斯·唐

1
您也可以使用aescrypt加密的文件来做到这一点(我做到了): . <(aescrypt -d -o - file.aes)
Freedom_Ben

3

如果您已gpg-agent正确设置,使用pinentry-tty或不会污染stdin / stdout的其他版本,则您应该能够执行以下操作:

source <( gpg --decrypt file.gpg )

这使用过程替换将结果source作为文件来提供。外壳处理完后,特定的文件数据将消失,但是此后您仍然需要注意外壳内存中的敏感数据。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.