如何清理预期的输出?

如何清理预期的输出?

背景:我正在使用 Expect 在 AMCE.sh 和托管网络交换机之间进行连接。我可以通过 SSH 连接到交换机、登录并发出命令,但由于交换机管理 SSL 证书的方式,我每次都必须生成新的 CSR。当您运行命令时,CSR 将显示在终端上,而不是作为可以下载的文件。我需要将 CSR 保存为文件,以便可以将其输入 ACME.sh。

实际问题:

我在 Expect 脚本中有以下内容,目的是当交换机将 CSR 吐出到文件中时捕获输出$csr,并在结束行进入时停止捕获。

send -- "command to generate CSR"
send -- "\r"
log_file -noappend $csr
expect -- "-----END CERTIFICATE REQUEST-----"
log_file

运行良好,我得到一个文件,问题是我从终端得到一堆额外的垃圾(下面的截断示例,通常有大约 KB 的额外垃圾)。我尝试通过sedz orgrep` 提供此内容,但它们似乎无法处理我想从中提取内容的多行性质。

^[[68;33Hc^[[68;33H^[[?25h^[~~~~~~*SNIP*~~~~~~[[?25h^[[68;1H^[[1;68r^[[68;1H-----BEGIN CERTIFICATE REQUEST-----^M
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM^M
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC^M
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP1^M
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==^M
-----END CERTIFICATE REQUEST-----^M
^[[1;68r^[[68;1H^[[68;1H^[[2K^[[68;1H^[[?25h^[[68;1H^[[68;1Hswitch1.home.domain.uk(config)# ^[[68;1H^[[68;33H^[[68;1H^[[?25h^[[68;33H

如果我运行,cat test.csr我会干净地获取大部分文件,但是当我尝试使用提取我需要的内容时,sed我无法让它匹配我需要的内容。我尝试过的例子sed -E 's/([\s\S]*)(-----BEGIN CERTIFICATE REQUEST-----[\s\S]*-----END CERTIFICATE REQUEST-----)([\s\S]*)/\2/m;t;d' test.csr

[68;33Hc                         {end of command to generate CSR}
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTE~~~~~~*SNIP*~~~~~~moRRarVThXnbcF0a5nvGQtU8j7jP1
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----

那么,长话短说,我怎样才能期望得到我所需要的干净输出,或者我怎样才能获得sed或其他工具来在事后清理它?

答案1

使用正则表达式捕获期望模式所需的数据:

send -- "command to generate CSR"
send -- "\r"
expect -re "(-+BEGIN CERTIFICATE REQUEST-+.+-+END CERTIFICATE REQUEST-+)"

然后将捕获的文本写入文件,删除回车符

set csr_text [regsub -all {\r\n} $expect_out(1,string) {\n}]
set fh [open $csr w]
puts $fh $csr_text
close $fh

答案2

希望有一个答案,expect但如果没有,你可以使用 awk 进行后处理:

$ awk '
    BEGIN {
        beg = "-----BEGIN CERTIFICATE REQUEST-----"
        end = "-----END CERTIFICATE REQUEST-----"
    }
    { sub(/\r$/,"") }
    sub(".*"beg,beg),sub(end".*",end)
' file
-----BEGIN CERTIFICATE REQUEST-----
MIICoDCCAYgCAQAwWzEfMB0GA1UEAxMWc3dpdGNoMS5ob21lLmdvc3NldC51azENM
AsGA1UECxMEaG9tZTEPMA0GA1UECh~~~~~~*SNIP*~~~~~~3lsRknVNg/ZAATDaRC
KR3EIZFS3izUZ/+3wYzni84QZcp6s6HmDaB2moRRarVThXnbcF0a5nvGQtU8j7jP
J/RPoWPRQa7vsfnEgN+gjQj6EYHeD/uMKzYPWeKEyQ4VPmw7K/VLySbMg==
-----END CERTIFICATE REQUEST-----

我总是建议不要使用范围表达式来支持标志(请参阅https://stackoverflow.com/q/23934486/1745001)但既然你永远不会用它做其他任何事情,我想到底是什么。

相关内容