期望脚本 - 如何验证文件的第一行和最后一行

时间:2016-06-09 21:58:52

标签: tcl expect

我正在使用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语句的错误段并退出。

如何只验证文件的第一行和最后一行?

3 个答案:

答案 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]用于确定通道是否已到达输入结束。