awk를 사용하여 테이블에 nmap 출력

awk를 사용하여 테이블에 nmap 출력

nmap출력을 테이블이나 적어도 하나의 열로 얻으려고 합니다 . 나는 다음 명령을 사용하고 있습니다 :

$ sudo nmap -sn 192.168.103.0/24 \
    | awk '/Nmap scan report for/{printf $5;}/MAC Address:/{print ","substr($0, index($0,$3)) }' \
    | sort -t . -k 4,4n

그러나 나는 그것이 나에게 보여주기를 원합니다:

ip    mac address     hostname

()IP나 호스트 이름이 없으면 이 작업을 수행할 수 없습니다.

답변1

기술이 있으면 xmlstarletXML 출력을 구문 분석 nmap하고 원하는 거의 모든 테이블을 생성 할 수 있습니다.

nmap -sn -oX - 192.168.1.0/24 |
    xmlstarlet sel -t \
            -m '/nmaprun/host[status/@state="up"]' \
            -v 'address[@addrtype="ipv4"]/@addr' -o $'\t' \
            -v 'address[@addrtype="mac"]/@addr' -o $'\t' \
            -v 'hostnames/hostname[1]/@name' -n

샘플 XML 출력은 다음과 같습니다.

<nmaprun scanner="nmap" args="nmap -sn -oX - 192.168.1.0/24" start="1589146436" startstr="Sun May 10 21:33:56 2020" version="7.70" xmloutputversion="1.04">
  <verbose level="0"/>
  <debugging level="0"/>
  <host>
    <status state="up" reason="arp-response" reason_ttl="0"/>
    <address addr="192.168.130.6" addrtype="ipv4"/>
    <address addr="01:55:1E:C3:68:A3" addrtype="mac" vendor="SomeManufacturer"/>
    <hostnames>
      <hostname name="host6.roaima.co.uk" type="PTR"/>
    </hostnames>
    <times srtt="119229" rttvar="119229" to="596145"/>
  </host>
  <host>...</host>
  <host>...</host>
  <runstats>
    <finished time="1589146444" timestr="Sun May 10 21:34:04 2020" elapsed="8.09" summary="Nmap done at Sun May 10 21:34:04 2020; 256 IP addresses (4 hosts up) scanned in 8.09 seconds" exit="success"/>
    <hosts up="4" down="252" total="256"/>
  </runstats>
</nmaprun>

nmap핑 요청 에 응답하는 4개의 장치만 보여주는 샘플 처리된 출력

192.168.1.6     01:55:1E:C3:68:A3       host6.roaima.co.uk
192.168.1.8     92:66:9B:20:F1:17
192.168.1.15    53:77:5E:EA:FD:03       client15.roaima.co.uk
192.168.1.31    C4:88:FB:6C:64:AE

xmlstarlet도구는 XPath를 사용하여 XML 요소와 속성을 선택하여 일치시키거나( -m) 값을 추출합니다( -v).

답변2

정말로 사용하고 싶다면 awk이 스크립트가 도움이 될 수 있습니다.

nmap -sn 192.168.1.0/24 |
    awk '
        function out() { if (state=="up") { printf "%s\t%s\t%s\n",ip,mac,name; ip=""; mac=""; name=""; state="" } }

        /Nmap scan report/ { out(); name=$5; ip = substr($6,2,length($6)-2); if (ip=="") { ip=name; name="" } }
        /Host is/ { state=$3 }
        /MAC Address/ { mac=$3 }

        END { out() }
    '

원하는 경우 연속으로 굴립니다.

nmapping 요청 에 응답하는 장치 4개만 보여주는 샘플 출력

192.168.1.6     01:55:1E:C3:68:A3       host6.roaima.co.uk
192.168.1.8     92:66:9B:20:F1:17
192.168.1.15    53:77:5E:EA:FD:03       client15.roaima.co.uk
192.168.1.31    C4:88:FB:6C:64:AE

관련 정보