>
如何在 bash 脚本中屏蔽PEM 键的中间行
我需要通过 bash 脚本用掩码(*(回显我的 pem 键中间行
例如:-
-----BEGIN CERTIFICATE-----
MIICyjCCAbICCQDrpZYh8et7yTANBgkqhkiG9w0BAQsFADAnMQswCQYDVQQGEwJV
UzELMAkGA1UECAwCQ0ExCzAJBgNVBAcMAlNGMB4XDTE4MTExMjIwNDEwNVoXDTE4
MTIxMjIwNDEwNVowJzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQswCQYDVQQH
DAJTRjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnIdgpml8+xk+Oj
1RGMCyJ1P15RiM6rdtszT+DFBg893Lqsjoyd5YgwELLz0Ux8nviG4L5OXOujEpAP
2cQBxTSLQjBELBZY9q0Qky3+2ewqV6lSfcXrcf/JuDJGR5K8HSqwNG35R3WGnZ+O
JhY0Dmx06IAs/FF8gP88zTQ8M7zuaThkF8MaF4sWPf6+texQwjzk4rewknGBFzar
9wFxVwNCyDD6ewIYPtgDxdJ1bwBVoX3KKKXm8GStl/Zva0aEtbSq/161J4VbTro2
dxArMPKzxjD6NLyF59UNs7vbzyfiw/Wq7BJzU7Kued5KdGt0bEiyWZYO+EvvxGmE
1pHfqysCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAavj4CA+7XFVHbwYMbK3c9tN/
73hkMvkAZWix5bfmOo0cNRuCeJnRIX+o6DmusIc8eXJJJV/20+zoSvUwlsLDPXoN
+c41GfIiEUSaSdSBtETMy8oPga718nIwAvNgYiUHXnV3B0nLYBUpYSnsD00/6VXG
xZUIEVBd7Ib5aRwmK8U5drxoWaBoG5qdvH9iapwTrCcPsRjsLBq7Iza2oBORGlfF
CjqiW2+KJzwRiTQj70yceniGVHM+VSpFYCLJ0mXeyLfITy7joqxr4AGYz+EhpLuf
iDpYDNYlr0JDVQqogskWjrnWOh0YcIJKgVtiTh2HDM5TdQgeXg4wv5IqLok0Tw==
-----END CERTIFICATE-----
如
-----BEGIN CERTIFICATE-----
MIICyjCCAbICCQDrpZYh8et7yTANBgkqhkiG9w0BAQsFADAnMQswCQYDVQQGEwJV
****************************************************************
iDpYDNYlr0JDVQqogskWjrnWOh0YcIJKgVtiTh2HDM5TdQgeXg4wv5IqLok0Tw==
-----END CERTIFICATE-----
我尝试了awk
但失败了:
awk 'BEGIN{FS=OFS=""} {for(i=2;i<='15';i++) $i="*"}1'
这可能对你有用(GNU sed(:
sed -n '1p;1n;2p;2s/./*/gp;$!N;$!D;p' file
使用-n
选项关闭隐式打印。
打印第一行和第二行,然后将第二行的每个字符替换为*
并打印。
在文件的其余部分创建一个两行的窗口,并将其打印在最后一行。
经过反思,一个较短的解决方案:
sed 'N;2p;4s/S/*/g;4P;$!D' file
与第一个解决方案相同,但可能更神秘。
场景 1:17 行 PEM 文件
看起来您的文件有固定数量的行,并且您希望替换从第三行到第十五行的所有行。
你可以用sed
来解决它:
sed -e '3,15d' pemfile | sed -e "3 i\$(printf '*%.0s' {1..64})" > newpemfile
笔记:
sed -e '3,15d' pemfile
- 删除从第三行到第十五
行sed -e "3 i\$(printf '*%.0s' {1..64})" > newpemfile
- 添加 64 星号行作为第三行,并将文件另存为newpemfile
。
方案 2:将除两个分隔符行之间的第一个/最后一个行以外的所有行替换为具有硬编码星号数的行
如果你的问题是替换两个分隔符之间的行,你可以使用 GNU sed 解决方案,如
sed -E "/^-+BEGIN CERTIFICATE-+$/{
n;n;
:a; N; /n-+END CERTIFICATE-+$/!ba; s/.*(n.*n)/$(printf '*%.0s' {1..64})1/;
}" pemfile
查看此在线sed
演示
这里
/^-+BEGIN CERTIFICATE-+$/{
- 匹配类似---BEGIN CERTIFICATE----
的行,如果找到,则执行块命令:n;n;
- 读取两行,最后一行在模式空间中:a; N; /n-+END CERTIFICATE-+$/!ba;
- 读取所有行,直到一行,例如---END CERTIFICATE---
在模式空间后附加换行
符s/.*(n.*n)/$(printf '*%.0s' {1..64})1/;
- 将整个模式空间文本替换为 64 个星号和最后两行(我们在此处删除最后两行之前的所有行( }`
如果文件实际上是固定的 16 行长,我强烈建议使用 @WiktorStribizew 的 anser。
如果它可以变化(键可能具有更多或更少的位(,最简单的方法是将head
和tail
结合起来:
head -n2 key.pem ; echo 'XXXXXXX' ; tail -n2 key.pem
但是,如果您正在寻找单个命令,请查看另一个问题的答案:https://stackoverflow.com/a/48002163/2284641
这是我在我们的pem
文件上找到的工作
awk '/-----BEGIN/ {f=2} f-->0; /-----END/' etc/auth/server.pem
-----BEGIN CERTIFICATE-----
MIID8jCCAhoCCQDGQsEmfeBvJTANBgkqhkiG6w0BAQsFADB/MQswCQYDVQQGEwJV
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIF8jBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG6w0BBQwwDgQIpS+A9Ql+5uUCAggA
-----END ENCRYPTED PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MII8ejCCAmICCQCNHBN8tj/FwzANBgkqhkiG6w0BAQsFADB/MQswCQYDVQQGEwJV
-----END CERTIFICATE-----
它打印所有证书的页眉和页脚+证书的第一行。
不完全是请求的内容,但对于隐藏证书的目的应该没问题,并且可以在同一 pem 文件中使用多个证书和多个长度的证书。
或者这更正确(没有计数线,只有awk
(
awk '/-----BEGIN/ {f=2} f-->0; /-----END/ {print "****************************************************************n" p "n" $0} {p=$0}' etc/auth/server.pem
-----BEGIN CERTIFICATE-----
MII8MjCCAhoCCQDGQsEmfeBvJTANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
****************************************************************
WW/14Mz4
-----END CERTIFICATE-----
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIF8jBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIpS+A9Ql+5uUCAggA
****************************************************************
d9k=
-----END ENCRYPTED PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MII8ejCCAmICCQCNHBN8tj/FwzANBgkqhkiG9w0BAQsFADB/MQswCQYDVQQGEwJV
****************************************************************
ZZc1oaC0PKSzBmq+TpbR27B8Zra3gpoA+gavdRZj
-----END CERTIFICATE-----
awk '
/-----BEGIN/ {f=2}
f-->0;
/-----END/ {print "****************************************************************n" p "n" $0}
{p=$0}
' etc/auth/server.pem