Шаблон сопоставления полей gnmap с помощью SED

Я тестирую регулярное выражение, необходимое для создания извлечения полей с помощью Splunk для nmap, и думаю, что я могу быть рядом...

Пример полной строки:

Host: 10.0.0.1 (host)   Ports: 21/open|filtered/tcp//ftp///, 22/open/tcp//ssh//OpenSSH 5.9p1 Debian 5ubuntu1 (protocol 2.0)/, 23/closed/tcp//telnet///, 80/open/tcp//http//Apache httpd 2.2.22 ((Ubuntu))/,  10000/closed/tcp//snet-sensor-mgmt///  OS: Linux 2.6.32 - 3.2  Seq Index: 257  IP ID Seq: All zeros

Я использовал подчеркивание "_" в качестве разделителя, потому что это немного облегчает чтение.

root@host:/# sed -n -e 's_\([0-9]\{1,5\}\/[^/]*\/[^/]*\/\/[^/]*\/\/[^/]*\/.\)_\n\1_pg' filename

То же регулярное выражение с удаленными escape-символами:

root@host:/# sed -n -e 's_\([0-9]\{1,5\}/[^/]*/[^/]*//[^/]*//[^/]*/.\)_\n\1_pg' filename

Выход:

... ... ...
Host: 10.0.0.1 (host)   Ports: 
21/open|filtered/tcp//ftp///, 
22/open/tcp//ssh//OpenSSH 2.0p1 Debian 2ubuntu1 (protocol 2.0)/, 
23/closed/tcp//telnet///, 
80/open/tcp//http//Apache httpd 5.4.32 ((Ubuntu))/, 
10000/closed/tcp//snet-sensor-mgmt///   OS: Linux 9.8.76 - 7.3  Seq Index: 257 IPID Seq: All zeros
... ... ...

Как вы можете видеть, сопоставление с образцом работает, хотя я не могу:

1 - соответствует шаблону в конце строки (запятая и белый / табуляция). Последняя строка содержит нежелательный текст (в этом случае информация о времени ОС и TCP). Логическое "ИЛИ" для двух символов (запятая и пробел), похоже, не совпадает.

...(\,|\s)

а также

2 - удалить любые ненужные данные - т.е. напечатать только соответствующий шаблон. Это на самом деле печать всей линии. Если я уберу флаг sed -n, оставшееся содержимое файла также будет напечатано. Я не могу найти способ печатать только совпадающие регулярные выражения.

то есть, почему, когда я прямо говорю это не так, sed печатает эти строки? =>

Host: 10.0.0.1 (host) Ports:

а также

OS: Linux 2.6.32 - 3.2  Seq Index: 257  IP ID Seq: All zeros

Будучи довольно новым для sed и regex, любая помощь или указатели очень ценятся!

1 ответ

Во-первых, я бы посоветовал вам ознакомиться с выводом XML Nmap (доступно с -oX flag), который официально поддерживается машиночитаемым форматом вывода. Greppable (-oG или же .gnmap) вывод устарел и поэтому не содержит полезной информации о новых функциях Nmap, таких как traceroute и сценарии NSE.

Чтобы ответить на ваши вопросы напрямую,

  1. проблема с совпадением запятой или пробела вызывает ошибки, потому что символ чередования канала (|) необходимо экранировать, а не запятую. Кроме того, вы, вероятно, всегда хотите использовать символ пробела, но только иногда запятую. Вот как я бы это сделал:

    ,\?\s
    

Я не использую группирование, так как нет чередования ("или" pipe).

  1. sed это не печать "линий", которые вам не нужны, это печать пространства шаблона. Информационная страница sed объясняет, как работает sed, и является отличным справочником для написания сценариев sed. По сути, у вас есть 2 пробела для работы, и sed будет печатать все содержимое пространства шаблона, когда вы используете p команда.

В качестве примера того, как вы могли бы пойти по этому поводу, вот мой взгляд на сценарий sed для печати только информации о порте из .gnmap файл:

#!/usr/bin/sed -n 

#First, strip the beginning (Host and Ports labels) off
s/.*Ports: //

#Now match a port entry, consuming the optional comma and whitespace
#The comma and whitespace are replaced with a newline
s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\1\n_

#If we made a successful substitution, jump to :matched, 
t matched
#otherwise skip to the next input line
d

:matched
#Print the pattern space up to the first newline
P
#Then delete up to the first newline and start over with what's left
D

Все вместе в одну строку, это будет выглядеть примерно так:

sed -n -e 's/.*Ports: //;s_\([0-9]\{1,5\}/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/[^/]*/\),\?\s_\1\n_;t matched;d;:matched;P;D' file.gnmap

Также обратите внимание, что вы не можете рассчитывать на то, что некоторые поля в спецификации порта всегда будут пустыми. Например, если обнаружение версии было выполнено в службе RPC, будет заполнено информационное поле SunRPC.

Другие вопросы по тегам