如何解密文件以在另一个命令中使用而不将解密的文件写入磁盘?

如何解密文件以在另一个命令中使用而不将解密的文件写入磁盘?

我有一个命令 ( ansible-vault decrypt) 可以解密文件并将其写出。我可以将其写入文件或-/ stdout

然后,我想将这个解密的文件(私钥)与另一个需要像mycommand --key-file <path to file>.

我当前的脚本运行ansible-vault decrypt --output mykey.key将解密的文件写入磁盘,然后使用mycommand --key-file mykey.key,最后使用 删除它rm mykey.key

有没有办法以某种方式根本不将解密的文件写入磁盘,并且仍然能够mycommand像文件一样访问它?

我无法通过管道传输到第二个命令,因为它根本不从标准输入读取密钥。我唯一能想到的就是在运行命令之前创建一个虚拟磁盘,在那里写入密钥,并在所有命令运行后卸载虚拟磁盘,这(我认为)将使解密的密钥消失得无影无踪。

答案1

如果命令需要文件名,但不关心文件类型,则可以通过管道传递数据并指定/dev/stdin为文件名。/dev/stdin指的是标准输入。

ansible-vault decrypt | mycommand --key-file /dev/stdin

mycommand如果不接受管道,这将不起作用(如果程序要求文件可查找,通常会发生这种情况)。在这种情况下,您需要将密钥写入临时文件。

大多数 Linux 系统(以及许多其他 Unix 变体)确实具有开箱即用的内存文件系统。该文件系统的安装位置以及使用它需要什么权限取决于发行版。现代 Linux 系统有一个临时文件系统文件系统安装在多个位置,包括/run。通常,每个用户/run/user/1234在登录时都会获得一个目录,其中 1234 是他们的用户 ID。许多服务在下面创建自己的目录/run,并且/var/run通常是到 的符号链接/run。使用 来检查您的系统上有哪些可用的内容df -t tmpfs

请注意,写入临时文件系统的数据最终可能会进入交换区。记忆的内容也是如此。如果您想要防御硬盘被盗的威胁,则必须对交换区进行加密。如果您不使用休眠模式,则可以使用随机密钥进行交换加密,该密钥在每次启动时生成并且不存储在任何地方。

答案2

在我看来,这是一个非常好的fifo.

您创建一个fifo(使用mkfifo)作为特殊文件引用,ansible 输出到该文件,然后您的命令读取它。但它不是文件,不涉及存储。

正如所推荐的,shell“此处”文件也是很好的候选者(<(CMD)构建)。

相关内容