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ペアです。また、SIGPIPE
5MBを受け取ったらパイプを閉じます。 openssl プロセスがパイプに書き込もうとすると、システムコールにエラーが発生します。head
dd
EPIPE
write()
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の前にまたはを使用してくださいhead
。dd
$ head -c 5M /dev/zero | openssl enc -aes-256-ctr -pass pass:password -nosalt >file
$ echo ${PIPESTATUS[@]}
0 0