如何在 bash 脚本中屏蔽 PEM 密钥的中行



>
如何在 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。

如果它可以变化(键可能具有更多或更少的位(,最简单的方法是将headtail结合起来:

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