如何在管道中使用 openssl 加密例程的输出?

如何在管道中使用 openssl 加密例程的输出?

openssl 手册声称openssl enc默认使用标准输出。

但是解密文件时标准输出有些不对劲。将输出通过管道传输到任何应用程序(例如 grep)会导致 openssl 错误:

error writing output file

有解决方法吗?

答案1

该错误消息意味着管道的读取端已关闭,openssl 无法再写入管道。例如,如果您通过管道传输到一个快速终止的命令而不读取其所有输入,就会发生这种情况:

$ dd count=400 if=/dev/urandom | openssl enc | true
error writing output file

通常,一个没有找到任何内容的简单 grep 就可以工作:

$ dd count=400 if=/dev/urandom | openssl enc | grep notgoingtomatch

但是,如果 grep 匹配,则注意到输入文件是一堆二进制垃圾,它将停止读取并且管道损坏:

$ dd count=400 if=/dev/urandom | openssl enc | grep a
error writing output file
Binary file (standard input) matches

(在这种情况下你可以使用grep -a来避免错误)。

另外,如果将 grep 输出通过管道传输到寻呼机中,例如较少的,然后退出较少的在看到所有结果之前,这会破坏 grep 的管道输出,如果有更多要写入的内容,grep 就会死掉,导致 openssl 管道也被破坏。

相关内容