Ejecutar varias veces el mismo comando con varios argumentos después de una tubería

Ejecutar varias veces el mismo comando con varios argumentos después de una tubería

Tengo una clave (de datos binarios aleatorios) que genera get_key.

Y con esta clave puedo hacer varias cosas con mis archivos cifrados. Por ejemplo, puedo descifrarlos.

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

Me gustaría saber cómo podría generalizar eso a narchivos donde los archivos se proporcionan como FILES=file1 file2 file3 file4 file5.

Por el momento, puedo ver dos soluciones:

1) Calcular una cadena evaly

2) reemplace decrypt por una función recursiva fque llama a decrypt tee >(decrypt A[0]) | f ("${A[@]:1}")(descifra el primer elemento y se llama a sí mismo de forma recursiva) si la matriz no está vacía y nada si lo está.

Quería saber si tenía una manera mejor de hacerlo (tenga en cuenta que no quiero que la clave se escriba en un archivo o variable, por lo que los bucles no son una opción).


Editar: lo usaré enhttps://github.com/xavierm02/combine-keys

Respuesta1

Dado su caso de uso, no tiene sentido comenzar a ejecutar el descifrado hasta que la clave se haya generado por completo, por lo que no necesita iniciar los decryptprocesos hasta que get_keyhaya finalizado. Por lo tanto, una tubería no tiene ninguna ventaja; también puede almacenar la salida en get_keyalgún lugar y usarla después.

Almacenar la salida en una variable es la forma más sencilla. Sin embargo, dado que se trata de datos binarios que pueden contener bytes nulos,esto sólo funciona en zsh, no en otros shells. Si le preocupa la seguridad, no lo esté: un atacante que pueda observar el contenido de la variable también puede ejecutarla get_keyy observar su salida.

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

En otros shells, puede utilizar un archivo temporal. Asegúrese de que sólo usted pueda leerlo. Si el archivo temporal está en un sistema de archivos en disco, existe un pequeño riesgo de que la clave se filtre si el disco duro del servidor fue robado en el momento equivocado. Si el archivo está en un sistema de archivos en memoria, no existe tal riesgo.

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

Si no desea utilizar un archivo temporal y no tiene zsh, puede utilizar otro lenguaje como Perl o Python.

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

Si no tiene un lenguaje mejor que un shell POSIX o ksh o bash, y no puede usar un archivo temporal, entonces necesitará recurrir a la canalización tee(o realizar algunas codificaciones y decodificaciones complicadas). Para hacer frente al número variable de salidas, puedecrear un quince por salida, o build y evaluna cadena que contenga lo necesario <(…)(cuidado con las complicadas comillas).

Respuesta2

Cree FIFO en un bucle y haga que sus decryptcorreos electrónicos esperen a que se escriban en:

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

información relacionada