opensslで常に「出力ファイルの書き込みエラー」が発生する

opensslで常に「出力ファイルの書き込みエラー」が発生する

openssl次のコマンドを使用して5MiBランダムファイルを作成しましたhead

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

正しいサイズのファイルが生成されますが、エラーメッセージも表示されます。

error writing output file

私はこれを試して、dd同じ結果を得ました。

$ 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

opensslその後、次のようにループデバイスを上書きしようとしました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

いつもerror writing output file

このエラーが発生する理由とその回避方法は何ですか?

ベストアンサー1

これはopensslsペアです。また、SIGPIPE5MBを受け取ったらパイプを閉じます。 openssl プロセスがパイプに書き込もうとすると、システムコールにエラーが発生します。headddEPIPEwrite()

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 が終了します。例では、次のコマンドを使用してこれを確認できます。

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

この$PIPESTATUS配列には、パイプ内プロセスの終了値が含まれます。 opensslプロセスが終了コード1で終了したことがわかります。


ただし、エラーを克服するには、パイプラインでopensslの前にまたはを使用してくださいheaddd

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

おすすめ記事