Sempre 'erro ao gravar arquivo de saída' no openssl

1

Eu criei um arquivo aleatório de 5 MiB usando openssl com head :

$ openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | head -c 5M > /mnt/pny1/file1

Ele criou um arquivo do tamanho correto, mas também forneceu uma mensagem de erro:

error writing output file

Eu tentei com dd e obtive o mesmo resultado:

$ openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | dd of=/mnt/pny1/file2 bs=1M count=5 iflag=fullblock
5+0 records in
5+0 records out
error writing output file
5242880 bytes (5.2 MB) copied, 0.0194212 s, 270 MB/s

Tentei substituir um dispositivo de loop usando openssl com cat :

# openssl enc -aes-256-ctr -pass pass:1o0SxTnYvbtjFtKLiuv3ccPebLOJiUU -nosalt < /dev/zero | cat > /dev/loop0
cat: write error: No space left on device
error writing output file

Sempre error writing output file .

Por que esse erro está ocorrendo e como evitá-lo?

    
por EmmaV 09.12.2015 / 04:19

1 resposta

3

Ele abre a manipulação incorreta de SIGPIPE . head e também dd fecharão o pipe quando receberem seus 5 MB. Isso produz um erro EPIPE na chamada do sistema write() quando o processo openssl tenta gravar no canal:

EPIPE    fd is connected to a pipe or socket whose reading end is closed. When this
         happens the writing process will also receive a SIGPIPE signal.

openssl então morreu devido a um sinal ao invés de sair normalmente. Você pode verificar isso em seu exemplo usando:

$ openssl enc -aes-256-ctr -pass pass:password -nosalt < /dev/zero | head -c 5M >file
error writing output file
$ echo ${PIPESTATUS[@]}
1 0

A matriz $PIPESTATUS contém os valores de saída dos processos nos pipes. Você vê o processo openssl encerrado com o código de saída 1.

No entanto, para superar esse erro, use head ou dd antes do openssl no canal:

$ head -c 5M /dev/zero | openssl enc -aes-256-ctr -pass pass:password -nosalt >file
$ echo ${PIPESTATUS[@]}
0 0
    
por 09.12.2015 / 08:24

Tags