我有一个命令 ( 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)
构建)。