パイプの後に複数の引数を指定して同じコマンドを複数回実行する

パイプの後に複数の引数を指定して同じコマンドを複数回実行する

によって生成されるキー(ランダムなバイナリデータ)がありますget_key

このキーを使用すると、暗号化されたファイルに対していくつかの操作を実行できます。たとえば、ファイルを復号化できます。

get_key | tee >(decrypt file1) >(decrypt file2)

nファイルが として指定されているファイルにこれを一般化する方法を教えてくださいFILES=file1 file2 file3 file4 file5

現時点では、2 つの解決策が考えられます。

1) 文字列を計算しeval

f2) 配列が空でない場合は decrypt を呼び出しtee >(decrypt A[0]) | f ("${A[@]:1}")(最初の要素を復号化し、自分自身を再帰的に呼び出します)、配列が空の場合は何も行わない再帰関数に decrypt を置き換えます。

もっと良い方法があるかどうか知りたかったのです (キーをファイルや変数に書き込まないので、ループは選択肢ではないことに注意してください)。


編集:私はこれをhttps://github.com/xavierm02/combine-keys

答え1

あなたのユースケースでは、キーが完全に生成されるまで復号化の実行を開始しても意味がないので、完了するdecryptまでプロセスを起動する必要はありません。したがって、パイプには利点がないので、出力をどこかに保存して後で使用したほうget_keyがよいでしょう。get_key

出力を変数に格納するのが最も簡単な方法です。ただし、これはヌルバイトを含む可能性のあるバイナリデータなので、これはzshでのみ機能し、他のシェルでは機能しませんセキュリティについて心配する必要はありません。変数の内容を観察できる攻撃者は、get_keyその出力を実行して監視することもできます。

key=$(get_key)
for file in $FILES; do
  print -rn -- $key | decrypt $file
done

他のシェルでは、一時ファイルを使用できます。必ず自分だけが読み取り可能にしてください。一時ファイルがディスク上のファイルシステム上にある場合、サーバーのハードディスクが不意に盗まれた場合にキーが漏洩するリスクがわずかにあります。ファイルがメモリ内のファイルシステム上にある場合、そのようなリスクはありません。

key_file=$(umask 077; mktemp)
get_key >"$key_file"
for file; do
  decrypt "$file" <"$key_file"
done
rm "$key_file"

一時ファイルを使用したくない場合や、zsh がない場合は、Perl や Python などの別の言語を使用できます。

perl -e '
    $key = `get_key`;
    foreach (@ARGV) {
        open KEY, "|-", "decrypt", $_ or die $!;
        print KEY $key or die $!;
        close KEY or die $!;
    }'

POSIXシェルやksh、bashよりも良い言語がなく、一時ファイルを使用できない場合は、パイプに頼るtee(または面倒なエンコードとデコードを行う)必要があります。出力の可変数に対処するには、次のようにします。出力ごとに1つのFIFOを作成する、または build とeval必要なものを含む文字列<(…)(引用符の扱いに注意してください)。

答え2

ループ内に FIFO を作成し、decrypt書き込みが行われるまで s を待機させます。

for i in "${A[@]}";do
    mkfifo /tmp/"$i"_fifo
    decrypt "$i" </tmp/"$i"_fifo &
done
getkey | tee >/dev/null /tmp/*_fifo
rm -f /tmp/*_fifo

関連情報