Mit nmap kann man u. a. das Netzwerk nach erreichbaren Hosts scannen und in einer XML-Datei ausgeben lassen.
Der Befehl hierzu lautet:
nmap -sP -oX netzwerk.xml 192.168.1.1-254
Eine mögliche Ausgabe könnte so aussehen (gekürzt):
<?xml version="1.0" ?>
<?xml-stylesheet href="file:///usr/share/nmap/nmap.xsl" type="text/xsl"?>
<!-- Nmap 5.21 scan initiated Thu Nov 29 10:23:43 2012 as: nmap -sP -oX netzwerk.xml 192.168.1.-254 -->
<nmaprun scanner="nmap" args="nmap -sP -oX netzwerk.xml 192.168.1.1-254" start="1354181023" startstr="Thu Nov 29 10:23:43 2012" version="5.21" xmloutputversion="1.03">
<host>
<status state="up" reason="arp-response"/>
<address addr="192.168.1.1" addrtype="ipv4" />
<address addr="AA:BB:CC:DD:EE:AB" addrtype="mac" vendor="3com" />
<hostnames>
</hostnames>
<times srtt="359" rttvar="5000" to="100000" />
</host>
<host>
<status state="up" reason="arp-response"/>
<address addr="192.168.1.2" addrtype="ipv4" />
<address addr="AA:BB:CC:DD:EE:FF" addrtype="mac" />
<hostnames>
<hostname name="srv01.lan.local" type="PTR"/>
</hostnames>
<times srtt="214" rttvar="5000" to="100000" />
</host>
<host>
<status state="down" reason="no-response"/>
<address addr="192.168.1.10" addrtype="ipv4" />
</host>
<runstats>
<finished time="1354181024" timestr="Thu Nov 29 10:23:44 2012" elapsed="0.80"/><hosts up="99" down="155" total="254" />
<!-- Nmap done at Thu Nov 29 10:23:44 2012; 254 IP addresses (2 hosts up) scanned in 0.80 seconds -->
</runstats>
</nmaprun>
Um relevante Informationen wie IP, MAC und Hostname aus der XML-Datei in eine Textdatei schreiben zu lassen, braucht man eine XSL-Datei. In der Ausgabe sollen nur die Hosts auftauchen, die auch erreichbar waren.
Die XSL-Datei (nmapout.xsl) hierfür sieht so aus:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="text" encoding="UTF-8" />
<!-- Feldtrenner fuer die Ausgabe definieren -->
<xsl:variable name="delimiter" select="','"/>
<!-- Beginn -->
<xsl:template match="/">
<!-- IP-Adresse und MAC-Adresse -->
<xsl:for-each select="nmaprun/host">
<!-- Testen, ob die IP erreichbar war -->
<xsl:if test="status[@state='up']">
<xsl:value-of select="address[@addrtype='ipv4']/@addr"/>
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="address[@addrtype='mac']/@addr"/>
<!-- Testen, ob ein Hostname eingetragen ist. -->
<xsl:if test="hostnames/hostname[@name!='']">
<xsl:value-of select="$delimiter"/>
<xsl:value-of select="hostnames/hostname[@type='PTR']/@name"/>
</xsl:if>
<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
<!-- Ende -->
</xsl:template>
</xsl:stylesheet>
Um jetzt die gewünschten Daten in eine Textdatei zu bekommen, müssen wir folgenden Befehl eingeben:
xsltproc nmapout.xsl netzwerk.xml > ausgabedatei.txt
Die resultierende Textdatei sieht dann so aus:
192.168.1.1,AA:BB:CC:DD:EE:AB
192.168.1.2,AA:BB:CC:DD:EE:FF,srv01.lan.local