openssl
我使用以下命令创建了一个 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
。
为什么会出现此错误以及如何防止它?
答案1
这是 openssls 对SIGPIPE
.当他们收到 5 MB 时head
也会dd
关闭管道。当 openssl 进程尝试写入管道时,这会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
答案2
如果解密的数据太少,那么你可能会遇到这个问题。我使用了 GNU 并行实用程序。遇到这个问题(写入输出文件时出错)。通过使用 --blocksize 添加块的最小大小来修复此问题。另外,openssl 有点奇怪,它在我遇到的任何问题上都会返回此错误(解密密码错误,解密数据错误)。所以要注意。
答案3
如果其他答案不能解决您的问题,尝试填充消息到更长的长度。
使用密钥的长度或其倍数。
没有其他答案可以回答上述问题,因此我决定检查我正在编码的消息。时间很短。我用空格填充了它,直到密钥的长度,然后修复了它。