使用Powershell提取PEM文件行,在开头和结尾添加引号,使其成为一行

问题描述 投票:0回答:1

如何获取如下所示的 .PEM 内容:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK
XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx
mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe
jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ
HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW
qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO
wwIDAQAB
-----END PUBLIC KEY-----

使其看起来像这样一行:

"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"

我可以使用以下命令删除开始和结束行:

    $File = "C:\pathto\some.pem"
    $content = Get-Content $file
    $contents =  $content
    
    $Complete = [regex]::split($contents, "-----BEGIN PUBLIC KEY-----(.*?)-----END PUBLIC KEY-----")
    
    for($i = 1; $i -lt $Complete.Length; $i =$i+2){
        $Complete[$i] -replace " ","`r`n"
    }
regex string powershell pem
1个回答
0
投票

首先,一些注意事项:

  • 如评论中所述,预期输出中的引号似乎不匹配 - 您在字符串的开头有一个引号 (

    "k=rsa
    ),该引号由第一个 p 值末尾的引号 (
     p=MIIB...VudK"
    )。我不确定这是否是一个拼写错误,或者这是否是预期的输出,所以我将按其表面价值并假设它是预期的输出。如果这是一个拼写错误,您可能需要稍微调整一下这个答案。

  • 问题中 PEM data 的最后一行是

    wwIDAQAB
    但您的示例输出以
    "bwIDAQAB"
    结尾 - 一个以
    w
    开头,另一个以
    b
    开头 - 我假设这是一个拼写错误,我将使用以
    b
    开头的值来匹配预期的输出。


回答

Get-Content
返回一个 array 字符串,相当于:

$content = @(
    "-----BEGIN PUBLIC KEY-----",
    "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK",
    "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx",
    "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe",
    "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ",
    "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW",
    "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO",
    "bwIDAQAB",
    "-----END PUBLIC KEY-----"
);

(请注意,我已将最后一个数据行更改为

bwIDAQAB
以匹配您的预期输出)。

为了完整起见,这是您的预期输出:

$expected = '"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"'

如果您使用的是 PowerShell 7,您可以执行以下操作:

$complete = @(
    "`"k=rsa; p=",
    ($content[1..($content.Length - 2)] -join "`" `""),
    "`""
) -join ""

$complete -eq $expected
# True

基本上:

  • "k=rsa; p=
    前缀
  • 开头
  • 丢弃 PEM 输入的第一行和最后一行
  • 用文字
    " "
    分隔符连接剩余的行
  • 添加
    "
    后缀

给予:

"k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ6AMIIBCgKCAQEAse68c1suNUQr0d79VudK" "XgmNxggQoaqR9fZoCrUz/gRS5XZm9wDL9HHxjYjEhZsuXQw1SZpYggjRQuqE+7Nx" "mhgn6DXXjWiTZ2b/ScE9mu+RQyh4hWEk9u+uUD2MZ9oPUZi2tN43InH9Qduza1Fe" "jQeh6OW6Bg+fTsBXtPJWawF/3oMCdWVfZ8Iel0ilP+61B5ldkw7g//QMf5mqzvkQ" "HK5/gKPCfGUylRDtJOxOriM5XqCjgtw6Sye8hgql5DGOCZTrXAahNbnw0bGm5TYW" "qosD+B2Rh/Xa600j/X0JAABQ8Pi1b0PAycGdMW7HPQ1YAp5Q7PbQQxlmlWeHQEgO" "bwIDAQAB"

如果您使用的是 PowerShell 5.1范围运算符 (

..
) 不可用,但您可以这样做:

$complete = @(
    "`"k=rsa; p=",
    (($content | select-object -Skip 1 -First ($content.Length - 2)) -join "`" `""),
    "`""
) -join ""

$complete -eq $expected
# True

这是做同样事情的稍微冗长的方式。

© www.soinside.com 2019 - 2024. All rights reserved.