로그가 많은 대규모 nmap 스캔이 있습니다. 나는 이것을 IP 목록으로 바꾸려고합니다.
명령을 실행하면 다음과 같은 피드백을 받습니다.
Starting Nmap 7.25BETA2 ( https://nmap.org ) at 2017-03-17 21:27 EDT
Nmap scan report for 10.10.1.22
Host is up (0.13s latency).
PORT STATE SERVICE
25/tcp open smtp
MAC Address: 00:50:56:89:7C:D5 (VMware)
Nmap scan report for 10.0.1.72
Host is up (0.22s latency).
PORT STATE SERVICE
25/tcp open smtp
MAC Address: 00:50:56:89:55:06 (VMware)
다음 명령을 사용하여 IP 목록만 검색하려고 합니다.
nmap -n -p 25 10.11.1.1-254 --open | grep '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'
나는 또한 awk 일치를 시도했습니다.
nmap -n -p 25 10.11.1.1-254 --open | awk '/\d{1,3}\.\d{1,3}\.\d\.\d{1,3}/ { print $0 } '
파이프의 오른쪽에 있는 모든 항목을 제거했을 때 출력을 볼 수 있었고 스크래치 패드의 정규식을 사용하여 IP를 올바르게 필터링할 수도 있었지만 결과는 반환되지 않았습니다.
내가 놓치고 있는 지식은 무엇인가?
답변1
이와 같은 경우 먼저 Nmap의 올바른 출력 형식을 사용해야 합니다. 엔맵Grepable 출력 옵션( -oG
)는 "사람이 읽을 수 있는" 일반 출력과 달리 버전 간에 일관되고 쉽게 구문 분석 가능한 형식으로 출력을 생성합니다. 포트 25가 열려 있는 모든 시스템 목록을 가져오는 방법은 다음과 같습니다.
nmap -p 25 --open 10.11.1.1-254 -oG - | awk '/^Host/{print $2}'
Nmap은 다음과 같은 줄을 생성합니다.
Host: 64.13.134.52 (scanme.nmap.org) Ports: 25/open/tcp//smtp///
awk 명령은 "Host" 줄의 시작 부분을 기준으로 일치하고 두 번째 필드(IP 주소)를 인쇄합니다.
답변2
\d
Perl 호환 정규 표현식(PRCE) 확장입니다: 귀하의 버전grep
가능한-P
옵션을 통해 이를 지원하세요.
grep -P '\d{1,3}\.\d{1,3}\.\d\.\d{1,3}'
그렇지 않으면 십진수를 사용할 수 있지만 [0-9]
중괄호는 기본 정규 표현식의 리터럴이므로 패턴을 확장하거나 -E
이스케이프해야 합니다.
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]\.[0-9]{1,3}'
또는
grep '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\.[0-9]\{1,3\}'