Executando várias vezes o mesmo comando com vários argumentos após um pipe

Executando várias vezes o mesmo comando com vários argumentos após um pipe

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 narquivos 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 evalela

2) substitua decrypt por uma função recursiva fque 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 decryptprocessos até get_keyterminar. Portanto, um pipe não tem vantagem, você também pode armazenar a saída em get_keyalgum 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_keye 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 evaluma string contendo o necessário <(…)(cuidado com as citações complicadas).

Responder2

Faça FIFOs em um loop e espere decryptque 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

informação relacionada