Cria FIFOs em um loop e espera que seus decrypt
s sejam gravados em:
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
Eu tenho uma chave (de dados binários aleatórios) que é gerada por get_key
.
E com essa chave, posso fazer várias coisas com meus arquivos criptografados. Por exemplo, posso decifrá-los.
get_key | tee >(decrypt file1) >(decrypt file2)
Eu gostaria de saber como eu poderia generalizar isso para n
arquivos onde os arquivos são dados como FILES=file1 file2 file3 file4 file5
.
No momento, vejo duas soluções:
1) Calcule uma string e eval
it
2) substituir decriptografia por uma função recursiva f
que chama descriptografar tee >(decrypt A[0]) | f ("${A[@]:1}")
(descriptografa o primeiro elemento e chama-se recursivamente) se a matriz não estiver vazia e nada se for.
Eu queria saber se você tinha uma maneira mais agradável de fazer isso (note que eu não quero que a chave seja gravada em um arquivo ou em uma variável, portanto loops não são uma opção).
Editar: vou usá-lo em link
Dado seu caso de uso, não há sentido em começar a executar a descriptografia até que a chave seja totalmente gerada, portanto, não é necessário iniciar os processos decrypt
até que get_key
tenha terminado. Portanto, um pipe não tem nenhuma vantagem, você pode também armazenar a saída de get_key
em algum lugar e usá-la posteriormente.
Armazenar a saída em uma variável é a maneira mais fácil. No entanto, como esses dados binários podem conter bytes nulos, isso só funciona em zsh, não em outros shells . Se você está preocupado com a segurança, não seja: um invasor que pode observar o conteúdo da variável também pode executar get_key
e observar sua saída.
key=$(get_key)
for file in $FILES; do
print -rn -- $key | decrypt $file
done
Em outros shells, você pode usar um arquivo temporário. Certifique-se de torná-lo legível apenas por você. Se o arquivo temporário estiver em um sistema de arquivos em disco, haverá um pequeno risco de que a chave possa vazar se o disco rígido do servidor for roubado na hora errada. Se o arquivo estiver em um sistema de arquivos na memória, não existe esse risco.
key_file=$(umask 077; mktemp)
get_key >"$key_file"
for file; do
decrypt "$file" <"$key_file"
done
rm "$key_file"
Se você não quiser usar um arquivo temporário e não tiver zsh, poderá usar outro idioma, como Perl ou Python.
perl -e '
$key = 'get_key';
foreach (@ARGV) {
open KEY, "|-", "decrypt", $_ or die $!;
print KEY $key or die $!;
close KEY or die $!;
}'
Se você não tem uma linguagem melhor que um shell POSIX ou ksh ou bash, e não pode usar um arquivo temporário, então você precisará retornar ao piping em tee
(ou fazer alguma codificação e decodificação) . Para lidar com o número variável de saídas, você pode criar um fifo por saída ou criar e eval
uma string contendo o necessário <(…)
(cuidado com as citações complicadas).