我正在使用Expect在远程系统上创建CSR文件。我正在捕获系统的输出并将其放入我本地PC上的文件中(需要它的地方)。
我需要验证此文件的第一行和最后一行,以确保该文件如下所示:
-----BEGIN CERTIFICATE REQUEST-----
.
.
.
-----END CERTIFICATE REQUEST-----
最初我只是通过循环查找-----END CERTIFICATE REQUEST-----
set fp [ open $csrname ]
while {[gets $fp line] != -1} {
if { $line == "-----END CERTIFICATE REQUEST-----" } {
puts "The Certificate Signing Request file \"$csrname\" has been succesfully created"
} else {
puts "The certificate file is invalid."
puts $line
exit 41
}
}
我的逻辑存在缺陷,因为我最终出现在if
语句的错误段并退出。
如何只验证文件的第一行和最后一行?
答案 0 :(得分:3)
企业社会责任并非如此之长;最多只有几千字节。我们可以一次验证这个地段!
# Load *everything* from a file at once
set f [open $csrname]
set contents [read $f]
close $f
# Validate it using this regular expression:
set RE {^-----BEGIN CERTIFICATE REQUEST-----\n.*\n-----END CERTIFICATE REQUEST-----\n*$}
if {![regexp $RE $contents]} {
puts "The certificate file is invalid."
exit 1
# This spot is unreachable, of course...
}
puts "The Certificate Signing Request file \"$csrname\" has been succesfully created"
我建议检查分隔符之间的位是否也只使用有效字符(它是base64编码的PKCS#10),但是一旦你超越了它,它就会变得更加复杂基本。可能最好只是确认你没有截断或者根本不是CSR的东西。
答案 1 :(得分:2)
唐纳德有一个很好的答案。以下是几种选择:
set first [exec sed {1q} $csrname]
set last [exec sed -n {$p} $csrname]
或
set f [open $csrname]
set lines [split [read -nonewline $f] \n]
close $f
set first [lindex $lines 0]
set last [lindex $lines end]
在任何一种情况下,你都可以
if {$first eq "-----BEGIN CERTIFICATE REQUEST-----" &&
$last eq "-----END CERTIFICATE REQUEST-----"} {...}
答案 2 :(得分:0)
您也可以参考http://wiki.tcl.tk/1466
[eof]用于确定通道是否已到达输入结束。