背景:我正在使用 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 or
grep` 提供此内容,但它们似乎无法处理我想从中提取内容的多行性质。
^[[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)但既然你永远不会用它做其他任何事情,我想到底是什么。