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 descriptografá-los.
get_key | tee >(decrypt file1) >(decrypt file2)
Gostaria de saber como poderia generalizar isso para n
arquivos onde os arquivos são fornecidos como FILES=file1 file2 file3 file4 file5
.
No momento, posso ver duas soluções:
1) Calcule uma string e eval
ela
2) substitua decrypt por uma função recursiva f
que chama decrypt does tee >(decrypt A[0]) | f ("${A[@]:1}")
(ela descriptografa o primeiro elemento e se chama recursivamente) se o array não estiver vazio e nada se estiver.
Eu queria saber se você tem uma maneira melhor de fazer isso (observe que não quero que a chave seja gravada em um arquivo ou variável, portanto os loops não são uma opção).
Editar: vou usá-lo emhttps://github.com/xavierm02/combine-keys
Responder1
Dado o seu caso de uso, não faz sentido começar a executar a descriptografia até que a chave seja totalmente gerada, portanto, você não precisa iniciar os decrypt
processos até get_key
terminar. Portanto, um pipe não tem vantagem, você também pode armazenar a saída em get_key
algum lugar e usá-la depois.
Armazenar a saída em uma variável é a maneira mais fácil. No entanto, como se trata de dados binários que podem conter bytes nulos,isso só funciona em zsh, não em outros shells. Se você está preocupado com a segurança, não se preocupe: um invasor que consegue 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 para você. Se o arquivo temporário estiver em um sistema de arquivos em disco, há um pequeno risco de que a chave vaze se o disco rígido do servidor for roubado na hora errada. Se o arquivo estiver em um sistema de arquivos na memória, esse risco não existe.
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 outra linguagem 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 tiver uma linguagem melhor do que um shell POSIX, ksh ou bash, e não puder usar um arquivo temporário, precisará voltar ao canal tee
(ou fazer alguma codificação e decodificação complicada). Para lidar com o número variável de saídas, você podecrie um fifo por saída, ou build e eval
uma string contendo o necessário <(…)
(cuidado com as citações complicadas).
Responder2
Faça FIFOs em um loop e espere decrypt
que eles 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