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 n
archivos donde los archivos se proporcionan como FILES=file1 file2 file3 file4 file5
.
Por el momento, puedo ver dos soluciones:
1) Calcular una cadena eval
y
2) reemplace decrypt por una función recursiva f
que 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 decrypt
procesos hasta que get_key
haya finalizado. Por lo tanto, una tubería no tiene ninguna ventaja; también puede almacenar la salida en get_key
algú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_key
y 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 eval
una cadena que contenga lo necesario <(…)
(cuidado con las complicadas comillas).
Respuesta2
Cree FIFO en un bucle y haga que sus decrypt
correos 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