2016-06-09 14 views
2

Ich verwende Erwarten, um eine CSR-Datei auf einem Remote-System zu erstellen. Ich nehme die Ausgabe vom System auf und lege sie in eine Datei auf meinem lokalen PC (wo es benötigt wird).Expect-Skript - Wie kann die erste und letzte Zeile einer Datei überprüft werden

Ich brauche die erste und die letzte Zeile dieser Datei zu validieren, um sicherzustellen, dass die Datei wie folgt aussieht:

-----BEGIN CERTIFICATE REQUEST----- 
. 
. 
. 
-----END CERTIFICATE REQUEST----- 

Ursprünglich war ich nur für die letzte Zeile suchen (oder so dachte ich) von looping durch die Zeilen der Datei für -----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 
    } 
} 

suchen habe ich einen Fehler in meiner Logik, weil ich in dem Fehler Beine der if Anweisung und Ausfahrt am Ende.

Wie kann ich nur die erste und letzte Zeile der Datei überprüfen?

+1

Setzen Sie Variablen vor der while-Schleife, um zu verfolgen, wann Sie diese Zeilen gefunden haben, und setzen Sie die else-Anweisung nach der while-Schleife, so dass der Fehler nur nach dem Durchsuchen der gesamten Datei ausgegeben wird. – aznbanana9

Antwort

3

Ein CSR ist nicht wirklich so lang; nur ein paar Kilobytes höchstens. Wir können das Los auf einen Schlag bestätigen!

# 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" 

Ich würde empfehlen, die Überprüfung, dass das Bit zwischen den Separatoren ist nur mit zu gültigen Zeichen (es ist Base64-codierte PKCS # 10), aber das ist etwas komplizierter, wenn Sie über die Grundlagen gehen. Am besten, um zu bestätigen, dass Sie keine Kürzung oder etwas haben, das überhaupt kein CSR ist.

+0

Donal, Vielen Dank. Die von Ihnen geteilte Lösung funktioniert einwandfrei. –

2

Donal hat eine nette Antwort. Hier sind ein paar Alternativen:

set first [exec sed {1q} $csrname] 
set last [exec sed -n {$p} $csrname] 

oder

set f [open $csrname] 
set lines [split [read -nonewline $f] \n] 
close $f 
set first [lindex $lines 0] 
set last [lindex $lines end] 

In jedem Fall können Sie

if {$first eq "-----BEGIN CERTIFICATE REQUEST-----" && 
    $last eq "-----END CERTIFICATE REQUEST-----"} {...} 
+0

Glenn, Ihre Lösung löst auch meine fehlerhaften Versuche. Vielen Dank. –

0

Auch können Sie sich auf http://wiki.tcl.tk/1466

[EOF] verwendet wird, um zu bestimmen, ob der Kanal das Ende der Eingabe erreicht hat.