我有一个由get_key
.
有了这个密钥,我可以对我的加密文件做几件事。例如,我可以解密它们。
get_key | tee >(decrypt file1) >(decrypt file2)
我想知道如何将其概括为n
文件以FILES=file1 file2 file3 file4 file5
.
目前,我可以看到两种解决方案:
1) 计算一个字符串和eval
它
2)如果数组不为空,则用f
调用decrypt do的递归函数替换decrypt tee >(decrypt A[0]) | f ("${A[@]:1}")
(它解密第一个元素并递归调用自身),如果数组不为空,则为空。
我想知道您是否有更好的方法来做到这一点(请注意,我不希望将密钥写入文件或变量,因此循环不是一种选择)。
鉴于您的用例,在完全生成密钥之前开始运行解密是没有意义的,因此您不需要在完成decrypt
之前启动进程get_key
。因此管道没有优势,您不妨将输出存储在get_key
某处,然后再使用。
将输出存储在变量中是最简单的方法。但是,由于这是可以包含空字节的二进制数据,因此这只适用于 zsh,不适用于其他 shell。如果您担心安全性,请不要担心:可以观察变量内容的攻击者也可以运行get_key
并观察其输出。
key=$(get_key)
for file in $FILES; do
print -rn -- $key | decrypt $file
done
Run Code Online (Sandbox Code Playgroud)
在其他 shell 中,您可以使用临时文件。确保它只有你自己可读。如果临时文件在磁盘文件系统上,那么如果服务器的硬盘在错误的时间被盗,密钥可能会泄露的风险很小。如果文件位于内存文件系统上,则不存在此类风险。
key_file=$(umask 077; mktemp)
get_key >"$key_file"
for file; do
decrypt "$file" <"$key_file"
done
rm "$key_file"
Run Code Online (Sandbox Code Playgroud)
如果不想使用临时文件,也没有 zsh,可以使用其他语言,如 Perl 或 Python。
perl -e '
$key = `get_key`;
foreach (@ARGV) {
open KEY, "|-", "decrypt", $_ or die $!;
print KEY $key or die $!;
close KEY or die $!;
}'
Run Code Online (Sandbox Code Playgroud)
如果您没有比 POSIX shell 或 ksh 或 bash 更好的语言,并且不能使用临时文件,那么您将需要回退到管道输入tee
(或进行一些繁琐的编码和解码)。为了应对可变数量的输出,您可以为每个输出创建一个 fifo,或者构建eval
一个包含必要的字符串<(…)
(注意棘手的引用)。