如何用Linux脚本反转CER文件中的证书块?
如何用Linux脚本反转CER文件中的证书块?
假设你有一个名为mycert.cer的文件,内容如下:
-----BEGIN CERTIFICATE----- this is sentence1 this is sentence2 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence3 this is sentence4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence5 this is sentence6 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence7 this is sentence8 -----END CERTIFICATE-----
期望输出为:
-----BEGIN CERTIFICATE----- this is sentence7 this is sentence8 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence5 this is sentence6 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence3 this is sentence4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence1 this is sentence2 -----END CERTIFICATE-----
你尝试了以下命令,但得到错误结果:
tac -s'-----BEGIN CERTIFICATE-----' mycert.cer | awk '/-----BEGIN CERTIFICATE-----/, /-----END CERTIFICATE-----/'
错误输出:
-----BEGIN CERTIFICATE----- this is sentence3 this is sentence4 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- this is sentence1 this is sentence2 -----END CERTIFICATE----- -----BEGIN CERTIFICATE----------BEGIN CERTIFICATE-----
解决方案
方法1:使用awk分组反转
这个方法会把每个证书块作为整体存储,最后反向输出:
awk ' /-----BEGIN CERTIFICATE-----/ { if (block != "") blocks[++n] = block; block = "" } { block = block $0 "\n" } END { blocks[++n] = block; for (i = n; i >= 1; i--) print blocks[i] } ' mycert.cer
原理:
- 遇到证书开始标记时,将之前积累的块存入数组(如果存在),重置当前块
- 逐行积累当前块的内容
- 处理完所有行后,将最后一个块存入数组,从后往前遍历数组输出每个块
方法2:结合tac和sed修正分隔符问题
你之前用tac的问题在于分隔符被截断,且处理后开头分隔符重复。可以通过自定义分隔符规避这个问题:
sed 's/-----BEGIN CERTIFICATE-----/XXXSEPXXX&/' mycert.cer | tac -s'XXXSEPXXX' | sed '/^XXXSEPXXX/d'
原理:
- 先用sed给每个证书开始标记前加自定义分隔符
XXXSEPXXX - 用
tac以该分隔符为单位反转内容 - 最后用sed清理掉多余的自定义分隔符
方法3:使用csplit拆分后反向合并
如果系统自带csplit工具,可先拆分证书块再反向合并:
csplit -z mycert.cer '/-----BEGIN CERTIFICATE-----/' '{*}' && cat xx[0-9][0-9] | tac && rm xx[0-9][0-9]
原理:
csplit按证书开始标记将文件拆分为多个临时文件(xx00、xx01等)tac反向输出这些临时文件的内容- 最后删除临时文件
内容的提问来源于stack exchange,提问作者user1068636
相关产品推荐
相关产品推荐

