Existe um operador “triple less than” com segurança binária no bash?

25

Esta é uma pergunta bastante hipotética, então, por favor, não me pergunte por que eu gostaria de fazer isso.

Supondo que eu tenha uma variável GIF que contém dados binários, e supondo que eu não possa usar o operador pipe | , o seguinte deve ser a maneira correta de usar 'triple-less -de operador ':

openssl enc -base64 <<< $GIF

No entanto, parece-me que <<< não é binary-safe e, portanto, os dados binários ficam corrompidos.

Existe um equivalente seguro para binário?

    
por Mikhail 04.10.2011 / 22:34

2 respostas

28

O redirecionamento aqui string ( <<< ) é um simples formulário do redirecionamento aqui documento ( << ). Aqui o redirecionamento de string não é "seguro para binário"; O Bash realizará a expansão na string here. Além disso, o Bash acrescentará uma nova linha ao final da string here (emita o comando xxd -p <<< "foo" e você obterá 666f6f0a no retorno).

Sua única aposta segura, excluindo canos, é I / O redirecionamento .

Pergunta segura não binária semelhante aqui . Você pode armazenar dados codificados e tentar isso

COMMAND_WITH_BIN_INPUT <(uudecode <(echo "$uuEncodedData")) 

no entanto, isso não está longe de

echo "$uuEncodedData"|uudecode|COMMAND_WITH_BIN_INPUT

mas sem metachar de tubo.

    
por 05.10.2011 / 02:47
4

Bash não é binário seguro em geral, e irá corromper nulos e novas linhas em variáveis contendo conteúdo binário durante a substituição.

Então eu acho que a resposta é "não", mas mais fundamentalmente "não em uma linguagem de script de shell", porque todos eles parecem ter problemas com o binário.

No entanto, eu diria que você planeja colocar os dados em $ GIF, em vez disso, você os obtém em um arquivo ou usa python como uma linguagem de script alternativa que manipula dados binários sem problemas.

    
por 05.10.2011 / 01:06