SED를 사용한 패턴 일치 gnmap 필드

SED를 사용한 패턴 일치 gnmap 필드

nmap용 Splunk를 사용하여 필드 추출을 생성하는 데 필요한 정규식을 테스트하고 있는데 거의 비슷할 것 같습니다...

전체 라인 예:

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

이스케이프 문자가 제거된 동일한 정규식:

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 - 줄 끝(쉼표 및 흰색/탭 공간)의 패턴을 일치시킵니다. 마지막 줄에는 원치 않는 텍스트(이 경우 OS 및 TCP 타이밍 정보)가 포함되어 있습니다. 두 문자(쉼표와 공백)에 대한 부울 "OR"이 일치하지 않는 것 같습니다.

...(\,|\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 및 정규식을 처음 사용하는 경우 어떤 도움이나 조언이라도 대단히 감사하겠습니다!

답변1

-oX먼저, 공식적으로 지원되는 기계 판독 가능 출력 형식인 Nmap의 XML 출력(플래그와 함께 사용 가능)을 살펴보시기 바랍니다 . Greppable( -oG또는 .gnmap) 출력은 더 이상 사용되지 않으므로 Traceroute 및 NSE ​​스크립트와 같은 Nmap의 최신 기능에 대한 유용한 정보가 포함되지 않습니다.

귀하의 질문에 직접 답변해 드리기 위해,

  1. |쉼표가 아닌 대체 파이프 문자( )를 이스케이프해야 하기 때문에 쉼표나 공백을 일치시키는 문제로 인해 오류가 발생합니다 . 또한 항상 공백 문자와 일치시키고 싶지만 때로는 쉼표만 일치시키길 원할 수도 있습니다. 이것이 내가 할 방법입니다:

    ,\?\s
    

교대("또는" 파이프)가 없기 때문에 그룹화를 사용하지 않습니다.

  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 정보 필드가 채워집니다.

관련 정보