2016-07-10 15 views
-1

Um einen Zimbra-Server zu verwalten, muss ich einen Teil einer Postfix-Warteschlange löschen. auf Google Nach der Suche, fand ich ein Stück Perl-Code von https://wiki.zimbra.com/index.php?title=Managing-The-Postfix-Queues&redirect=no:Was ist los mit diesem Stück Perl-Code?

#!/usr/bin/perl 

$REGEXP = shift || die “no email-adress given (regexp-style, e.g. bl.*\@yahoo.com)!”; 

@data = qx; 
for (@data) { 
if (/^(\w+)(\*|\!)?\s/) { 
$queue_id = $1; 
} 
if($queue_id) { 
if (/$REGEXP/i) { 
$Q{$queue_id} = 1; 
$queue_id = “”; 
} 
} 
} 

open(POSTSUPER,”|/opt/zimbra/postfix/sbin/postsuper -d -”) || die “couldn’t  open postsuper” ; 

foreach (keys %Q) { 
print POSTSUPER “$_\n”; 
}; 
close(POSTSUPER); 

Aber wenn ich es, die System Berichte ausführen:

Unmatched right curly bracket at ./delete_queue.pl line 9, at end of line 
    (Might be a runaway multi-line ;; string starting on line 5) 
syntax error at ./delete_queue.pl line 9, near "}" 
syntax error at ./delete_queue.pl line 15, near "}" 
Unmatched right curly bracket at ./delete_queue.pl line 17, at end of line 
Execution of ./delete_queue.pl aborted due to compilation errors. 

Da ich keinen Programmierer Perl, sondern nur eine nicht-professioneller Mail-Server-Administrator, ich weiß nicht, was mit diesem Stück Perl-Code falsch ist.

Danke für Ihre Hilfe.

+0

Beginnen Sie mit dem Hinzufügen der Zeilen 'use strict; 'und' use warnings; 'am Anfang des Skripts, das der Zeile' #!/Usr/bin/perl' folgt. Gute Chance, dass die zusätzlichen Fehlermeldungen, die Sie erhalten, bei der Lösung Ihres Problems hilfreich sein werden. – edehont

+0

'@data = qx;' Dein Problem ist wahrscheinlich hier. Sie sollten etwas wie '@data = qx/a system command /' haben. Und Sie sollten immer 'strict' und' warnings' verwenden. – Dada

+1

Ich weiß nicht, was sie getan haben, um diesen Code zu bekommen, aber Sie verwenden * LEFT DOUBLE QUOTATION MARK * (U + 201C) und * RECHTE DOUBLE QUOTATION MARK * (U + 201D) anstelle von einfachen * QUOTATION MARK * (U + 0022). Perl erkennt nur Letzteres. Sie müssen etwas wie ein Textverarbeitungsprogramm verwendet haben, um Ihr Programm zu schreiben? Sie haben auch eine Anweisung '@data = qx;' was nichts bedeutet. Dieses Programm wird nie funktionieren – Borodin

Antwort

5

Hier ist die original code:

#!/usr/bin/perl 

$REGEXP = shift || die "no email-adress given (regexp-style, e.g. bl.*\@yahoo.com)!"; 

@data = qx</usr/sbin/postqueue -p>; 
for (@data) { 
    if (/^(\w+)(\*|\!)?\s/) { 
    $queue_id = $1; 
    } 
    if($queue_id) { 
    if (/$REGEXP/i) { 
     $Q{$queue_id} = 1; 
     $queue_id = ""; 
    } 
    } 
} 

#open(POSTSUPER,"|cat") || die "couldn't open postsuper" ; 
open(POSTSUPER,"|postsuper -d -") || die "couldn't open postsuper" ; 

foreach (keys %Q) { 
    print POSTSUPER "$_\n"; 
}; 
close(POSTSUPER); 

Wie Sie sehen können, werden die Seiten, die Sie von verstümmelten die qx</usr/sbin/postqueue -p> Teil kopiert, wodurch Syntaxfehler.

+0

In der Tat, es ist noch einige Änderungen erforderlich, um das Skript auszuführen, dass wir den Pfadnamen wie '/ usr/sbin' in den richtigen Pfad gemäß der Zimbra Installationskonfiguration ändern sollten. –