명령 출력 추출을 위한 최고의 도구

명령 출력 추출을 위한 최고의 도구

nmap 출력 결과를 프로그래밍 방식으로 처리하고 싶지만 출력을 가져오고 아래 두 출력에 표시된 프로토콜 또는 포트 테이블의 세부 정보만 추출하는 방법을 알 수 없습니다.

나는 awk를 사용하여 테이블 데이터를 처리할 수 있다고 확신합니다. 하지만 출력에서 ​​이 데이터를 추출할 수는 없습니다. 이를 위해 어떤 도구 조합을 사용할 수 있습니까?

$ sudo nmap --open -sO 10.100.0.14
Starting Nmap 7.70 ( https://nmap.org ) at 2021-12-27 19:15 AEDT
Warning: 10.100.0.14 giving up on port because retransmission cap hit (10).
Nmap scan report for teichos.mydomain.net (10.100.0.14)
Host is up (0.00030s latency).
Not shown: 250 filtered protocols, 1 closed protocol
PROTOCOL STATE         SERVICE
1        open          icmp
33       open|filtered dccp
80       open|filtered iso-ip
117      open|filtered iatp
136      open|filtered udplite
MAC Address: 6A:3A:ED:33:9E:00 (Unknown)

출력 2:

$ sudo nmap -sS 10.100.0.14 -p-
Starting Nmap 7.70 ( https://nmap.org ) at 2021-12-27 19:30 AEDT
Nmap scan report for teichos.mydomain.net (10.100.0.14)
Host is up (0.00024s latency).
Not shown: 65533 filtered ports
PORT     STATE SERVICE
22/tcp   open  ssh
9090/tcp open  zeus-admin
MAC Address: 6A:3A:ED:33:9E:00 (Unknown)

내가 찾고 있는 출력은 다음과 같습니다(제목은 필요하지 않음).

PROTOCOL STATE         SERVICE
1        open          icmp
33       open|filtered dccp
80       open|filtered iso-ip
117      open|filtered iatp
136      open|filtered udplite

그리고

PORT     STATE SERVICE
22/tcp   open  ssh
9090/tcp open  zeus-admin

답변1

옵션이 제공되면 nmap유틸리티를 통해 쉽게 구문 분석 가능한 XML을 출력할 수 있습니다 -oX. 즉, 필요에 따라 테이블을 다시 생성하거나 테이블에서 원하는 정보를 추출할 수 있습니다.

다음 파이프라인은 xmlstarlet생성된 XML 문서에서 정보를 추출하고 일반 출력에서 ​​찾은 테이블을 다시 생성 nmap하고 지정된 "상태"에 대한 "이유"가 포함된 추가 열을 삽입하는 데 사용됩니다.

의 출력은 nmap구문 분석되어 열 구분 기호로 문자(출력의 일부가 되기를 원하지 않는 모든 문자)를 xmlstarlet삽입 하고 최종 정렬 테이블을 생성하는 데 사용됩니다.#column

sudo nmap -oX - --open -sO localhost |
xmlstarlet sel -t -m /nmaprun/host/ports/port \
    -v @portid -o '#' \
    -v state/@state -o '#' \
    -v state/@reason -o '#' \
    -v service/@name -nl |
column -s '#' -t

출력 예:

1    open           echo-reply      icmp
4    open|filtered  no-response     ipv4
6    open           proto-response  tcp
17   open           port-unreach    udp
41   open|filtered  no-response     ipv6
50   open|filtered  no-response     esp
51   open|filtered  no-response     ah
97   open|filtered  no-response     etherip
112  open|filtered  no-response     vrrp
137  open|filtered  no-response     mpls-in-ip
240  open|filtered  no-response
255  open|filtered  no-response

이번에도 "필터링된" 응답만 추출합니다.

sudo nmap -oX - --open -sO localhost |
xmlstarlet sel -t -m '/nmaprun/host/ports/port[contains(state/@state,"filtered")]'  \
    -v @portid -o '#' \
    -v state/@state -o '#' \
    -v state/@reason -o '#' \
    -v service/@name -nl |
column -s '#' -t

출력 예:

4    open|filtered  no-response  ipv4
41   open|filtered  no-response  ipv6
50   open|filtered  no-response  esp
51   open|filtered  no-response  ah
97   open|filtered  no-response  etherip
112  open|filtered  no-response  vrrp
137  open|filtered  no-response  mpls-in-ip
240  open|filtered  no-response
255  open|filtered  no-response

답변2

표시되는 특정 출력에 따라 숫자나 대문자 P(헤더의 경우)로 시작하는 모든 줄을 간단히 선택할 수 있습니다.

sudo nmap ... | grep -E '^([0-9]|P)'

두 개의 텍스트 파일을 만들고 귀하의 질문에서 나온 두 가지 출력으로 테스트한 결과 다음과 같습니다 nmap1.nmap2

$ grep -E '^([0-9]|P)' nmap1 
PROTOCOL STATE         SERVICE
1        open          icmp
33       open|filtered dccp
80       open|filtered iso-ip
117      open|filtered iatp
136      open|filtered udplite

$ grep -E '^([0-9]|P)' nmap2
PORT     STATE SERVICE
22/tcp   open  ssh
9090/tcp open  zeus-admin

awk원하는 경우 다음과 같이 할 수도 있습니다.

sudo nmap ... | awk '/^([0-9]|P)/' 

답변3

$ awk '/^(PROTOCOL|PORT)/{f=1} /^MAC/{f=0} f' file
PROTOCOL STATE         SERVICE
1        open          icmp
33       open|filtered dccp
80       open|filtered iso-ip
117      open|filtered iatp
136      open|filtered udplite

$ awk '/^(PROTOCOL|PORT)/{f=1} /^MAC/{f=0} f' file
PORT     STATE SERVICE
22/tcp   open  ssh
9090/tcp open  zeus-admin

관련 정보