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

4

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

    
por xavierm02 08.05.2014 / 23:58

2 respostas

3

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
    
por 09.05.2014 / 00:08
5

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).

    
por 09.05.2014 / 02:19

Tags