Linux

在 openssl 中總是“錯誤寫入輸出文件”

  • April 15, 2020

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 退出。


但是,要克服該錯誤,請在管道中使用headdd在 openssl 之前:

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

引用自:https://unix.stackexchange.com/questions/248235