Я пишу парсер для файлов правил 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 -->
Не можете ли вы просто обернуть весь контент в ' ... '? –
choroba
Как загрузить файл из дескриптора файла в переменную и конкатенировать строки в начале и в конце? Это звучит выполнимо – Bruno9779
Я собираюсь с этим решением. Фактически я собираюсь загрузить все файлы как FH и обернуть «root» вокруг каждого, поэтому я избегаю уродливой системы (xmllint $ file), которую я использовал. Если вы напишете это решение в ответ, я приму его – Bruno9779