パイプライン後に複数のパラメータを使用して同じコマンドを複数回実行する

パイプライン後に複数のパラメータを使用して同じコマンドを複数回実行する

で生成したキー(任意のバイナリデータ)がありますget_key

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

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

nこれをファイルに一般化する方法を知りたいですFILES=file1 file2 file3 file4 file5

現在、2つの解決策を見ることができます。

eval1) 文字列の計算

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

これを行うより良い方法があるかどうか疑問に思います。ファイルや変数にキーを書きたくないので、ループはオプションではありません。


編集:私はこれを使うでしょうhttps://github.com/xavierm02/combine-keys

ベストアンサー1

ユースケースに応じて、キーが完全に生成される前に復号化の実行を開始することは意味がないため、完了するdecrypt前にプロセスを開始する必要はありません。get_keyしたがって、配管には利点はありません。出力をget_keyどこかに保存し、後で使用することもできます。

出力を変数に保存するのが最も簡単な方法です。しかし、これはnull byteを含むことができるバイナリデータなのでこれは他のシェルではなく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(または退屈なエンコードとデコードを実行する必要があります)。さまざまな出力数に対応するには、次のことができます。各出力のFIFO生成、またはeval必要な文字列を作成して含めます<(…)(トリッキーな引用に注意してください)。

おすすめ記事