2014-11-04 3 views
0

Я пишу парсер для файлов правил Ossec в perl.Perl анализирует искаженные XML-файлы

Я использую XML :: Simple, и он, как правило, отлично работает, но некоторые из файлов правил, о которых идет речь, неверны, вместо того, чтобы иметь верхний уровень <group> <\group>, есть несколько.

Я прочитал perlfaq: http://perldoc.perl.org/perlfaq6.html#How-can-I-pull-out-lines-between-two-patterns-that-are-themselves-on-different-lines%3f

я могу соответствовать тексту, используя пример, но все матчи сгруппированы.

код CLI У меня есть для этой операции:

perl -ne 'print if /^<group name/ .. /^<\\group>/' attack_rules.xml 

Как отделить различные матчи?

Вот пример уродлив XML:

<!-- Privilege scalation messages --> 
<group name="syslog,elevation_of_privilege,"> 
    <rule id="40501" level="15" timeframe="300" frequency="2"> 
    <if_group>adduser</if_group> 
    <if_matched_group>attacks</if_matched_group> 
    <description>Attacks followed by the addition </description> 
    <description>of an user.</description> 
    </rule> 
</group> <!-- SYSLOG, ELEVATION_OF_PRIVILEGE, --> 



<!-- Scan signatures --> 
<group name="syslog,recon,"> 
    <rule id="40601" level="10" frequency="10" timeframe="90" ignore="90"> 
    <if_matched_group>connection_attempt</if_matched_group> 
    <description>Network scan from same source ip.</description> 
    <same_source_ip /> 
    <info type="link">http://project.honeynet.org/papers/enemy2/</info> 
    </rule> 
</group> <!-- SYSLOG,SCANS --> 
+3

Не можете ли вы просто обернуть весь контент в ' ...'? – choroba

+0

Как загрузить файл из дескриптора файла в переменную и конкатенировать строки в начале и в конце? Это звучит выполнимо – Bruno9779

+0

Я собираюсь с этим решением. Фактически я собираюсь загрузить все файлы как FH и обернуть «root» вокруг каждого, поэтому я избегаю уродливой системы (xmllint $ file), которую я использовал. Если вы напишете это решение в ответ, я приму его – Bruno9779

ответ

1

Если единственная проблема является «кратными корнями», вы можете просто обернуть каждое содержимое файла в <root>...</root> и проанализировать результат.

Смежные вопросы