【问题标题】:Split command output in multiline blocks to be further processed在多行块中拆分命令输出以进行进一步处理
【发布时间】:2021-12-19 07:42:50
【问题描述】:

我正在尝试拆分 openssl 命令的输出,该命令以 base64 格式返回多个证书,中间有一些字符:

-----BEGIN CERTIFICATE-----
<base64 cert>
-----END CERTIFICATE-----
<random characters>
-----BEGIN CERTIFICATE-----
<base64 cert>
-----END CERTIFICATE-----
<random characters>
-----BEGIN CERTIFICATE-----
<base64 cert>
-----END CERTIFICATE-----
<random characters>

我希望每个证书(包括开始和结束行)然后再次传递给另一个 openssl 命令进行解码。

命令 1:openssl s_client -showcerts -connect server.com:443 命令 2:我想是 awk 的东西,但我无法弄清楚。 命令 3:openssl x509 -text -noout

command 1 | command 2 | command 3

最后我应该在标准输出中看到多个解码证书,一个接一个。

【问题讨论】:

    标签: linux openssl


    【解决方案1】:

    无法使用单个管道按照您想要的方式完成 - 您需要为每个单独的文件创建一个处理管道。 您可以做的是将证书分成多个文件并在之后循环处理这些文件,或者创建一个临时文件并进行处理;无论哪种方式,它都是一个迭代过程,例如:

    awk '
      BEGIN{i=0;}
      /^-----BEGIN CERTIFICATE-----$/{i=1;}
      {
        if(i){print > "/tmp/delme.crt";}
      }
      /^-----END CERTIFICATE-----$/{
        i=0;
        system("cat /tmp/delme.crt");
        close("/tmp/delme.crt");
      }' <(cat <<eof
    -----BEGIN CERTIFICATE-----
    <base64 cert1>
    -----END CERTIFICATE-----
    <random characters>
    -----BEGIN CERTIFICATE-----
    <base64 cert2>
    -----END CERTIFICATE-----
    <random characters>
    -----BEGIN CERTIFICATE-----
    <base64 cert3>
    -----END CERTIFICATE-----
    <random characters>
    eof
    )
    
    

    在这种情况下,awk 使用system 调用的cat 命令将是证书的处理,您可以使用 openssl 命令代替cat &lt;&lt; eof ...,该命令会为您提供所描述的输出。

    要将证书转储到单独的文件中,您可以:

    awk '
      BEGIN{i=0;j=100;}
      /^-----BEGIN CERTIFICATE-----$/{i=1;}
      {
        if(i){print > "/tmp/certificate"j".crt";}
      }
      /^-----END CERTIFICATE-----$/{
        i=0;
        close("/tmp/certificate"j++".crt");
      }' <(cat <<eof
    -----BEGIN CERTIFICATE-----
    <base64 cert1>
    -----END CERTIFICATE-----
    <random characters>
    -----BEGIN CERTIFICATE-----
    <base64 cert2>
    -----END CERTIFICATE-----
    <random characters>
    -----BEGIN CERTIFICATE-----
    <base64 cert3>
    -----END CERTIFICATE-----
    <random characters>
    eof
    )
    
    

    然后你就可以处理它们了:

    for i in /tmp/certificate*.crt; do echo "Processing file $i"; done
    

    输出

    Processing file /tmp/certificate100.crt
    Processing file /tmp/certificate101.crt
    Processing file /tmp/certificate102.crt
    

    【讨论】:

    • 我害怕这个答案...无论如何还是非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多