Linux
在 openssl 中總是“錯誤寫入輸出文件”
openssl
我使用with創建了一個 5 MiB 的隨機文件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
然後我嘗試使用with覆蓋循環設備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
。為什麼會發生此錯誤,我該如何預防?
這是 openssls 對
SIGPIPE
. 當他們收到他們的 5 MB 時也會關閉管道head
。當 openssl 程序嘗試寫入管道時,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 退出。但是,要克服該錯誤,請在管道中使用
head
或dd
在 openssl 之前:$ head -c 5M /dev/zero | openssl enc -aes-256-ctr -pass pass:password -nosalt >file $ echo ${PIPESTATUS[@]} 0 0