nmap Script zum Auflisten der Hosts im Netzwerk
Da dies mein erstes Script ist, bin ich für Verbesserungsvorschläge dankbar ! (ab und an denke ich wahrscheinlich zu kompliziert)
Ich wollte EINEN Host pro Zeile ausgeben mit den Infos „IP, Hostname, MAC, Vendor“, zum einen für die Übersichtlichkeit, zum anderen um Variablen zu sparen.
Version 1.2 (Bei Aktualisierung des Scripts, zuerst bestehende Variablen unter der Dummy-Instanz löschen!)
<?
// nmap Script für ip-Symcon, zum Auflisten der Hosts im Netzwerk
// 1. Erstelle eine Dummy-Instanz im Objektbaum, darunter werden die neuen Variablen erzeugt !
// 2. Installiere nmap -> apt install nmap
// 3. Anpassung der $Subnet Variable
// 4. Testlauf / Ausführen
// 5. Zeitgesteurtes Ereignis für dieses Script erstellen
// Info: Der Aufruf kann lokal [usr/bin/nmap] oder auf Remotesystem [ssh root@host -t nmap] erfolgen,
// bei Remoteaufruf muss auch Zeile 30 (Kopierbefehl) angepasst werden.
// -------------------------------------------------------------------------- V A R I A B L E N ---
$Instanz = 59717; // Objekt-ID der DUMMY Instanz !
$Nmap = "/usr/bin/nmap"; // Pfad zur nmap [apt install nmap]
#$Nmap = "ssh root@px4 -t nmap"; // Remoteaufruf auf anderem Linux-Host (ssh-copy-id!)
$Subnet = "192.168.0.0/24"; // Subnet im CIDR Format "192.168.1.0/24"
$Cleanup = 14; // Lösche Einträge älter als X Tage
$Debug = true;
// ------------------------------------------------------------------------------------------------
if ( strpos($Nmap,"ssh ") === false ) {
if (file_exists($Nmap) == false ) {
echo "$Nmap existiert nicht!
Lösung: apt install nmap";
die();
}
}
$File = str_replace(".","_",$Subnet);
$File = str_replace("/24",".xml",$File);
$File = "/tmp/".$File;
shell_exec($Nmap." -sn "." $Subnet -oX ".$File); // Aufruf und Ausgabe in xml
if ( strpos($Nmap,"ssh ") !== false ) shell_exec("scp root@px4:$File $File"); // --- Remoteaufruf Copybefehl anpassen! ---
$xml = simplexml_load_file($File);
//Profil "nmap" wird erstellt (einmalig)
if (IPS_VariableProfileExists("nmap") == false) {
IPS_CreateVariableProfile("nmap", 0);
IPS_SetVariableProfileAssociation("nmap", 0, "Offline", "", 0xff0000);
IPS_SetVariableProfileAssociation("nmap", 1, "Online", "", 0x2EFE2E);
}
//if($Debug) print_r($xml);
$Counter = 0;
foreach ($xml->host as $host) {
//IP
$IP = $xml->host[$Counter]->address[0]['addr'];
//if($Debug) echo $IP,"
";
//Hostname
$Hostname = $xml->host[$Counter]->hostnames->hostname['name'];
if($Debug) echo $Hostname,"
";
//Mac
$MAC = $xml->host[$Counter]->address[1]['addr'];
if($Debug) echo $MAC,"
";
//Vendor
$Vendor = $xml->host[$Counter]->address[1]['vendor'];
if($Debug) echo $Vendor,"
-----------------------------
";
CreateVariable($IP,$Hostname,$MAC,$Vendor);
$Counter++;
}
$summary = $xml->runstats->finished['summary'];
IPS_SetName($Instanz, "$Subnet - $summary"); // Schreibe Ergebniss in Instanz-Variable
CleanUp();
//Functions
function CreateVariable($IP,$Hostname,$MAC,$Vendor) {
global $Instanz, $Debug;
$IP = IP_Cidr($IP); // Funktion um IP Adresse 16stellig anzuzeigen (Sortierung!)
if ($Hostname == "" ) $Hostname = "N/A";
if ($MAC == "" ) $MAC = "N/A";
if ($Vendor == "" ) $Vendor = "N/A";
$TIMEST = date("Y.m.d - H:i");
$VarName = $IP." --- MAC: ".$MAC." --- Name: ".$Hostname." --- Vendor: ".$Vendor." --- Gesehen am: ".$TIMEST;
foreach(IPS_GetChildrenIDs($Instanz) as $VarSearchID) { // Durchsuche Objektbaum ob die IP schon vorhanden ist..
$Beschreibung = IPS_GetObject($VarSearchID)['ObjectInfo'];
if ($IP === $Beschreibung) {
$VarID = $VarSearchID;
if($Debug) echo $IP." exist (".$VarID.")
";
break;
}
}
if (!isset($VarID)) { // Wenn keine vorhandene Variable gefunden, neue Variable erzeugen, und einsortieren
$VarID = IPS_CreateVariable(0);
if($Debug) echo $IP." create : (".$VarID.")
";
IPS_SetParent($VarID, $Instanz); // Variable einsortieren unter dem Objekt mit der ID..
IPS_SetVariableCustomProfile($VarID, "nmap");
IPS_SetInfo($VarID, $IP); // IP in Beschreibungsfeld schreiben
}
IPS_SetName($VarID, $VarName); // Variable benennen
SetValue($VarID, true);
}
function CleanUp() {
global $Instanz, $Cleanup, $Debug;
foreach(IPS_GetChildrenIDs($Instanz) as $VarID1) {
//$IP1 = mb_substr(IPS_GetName($VarID1), 0, 15);
$IP1 = IPS_GetObject($VarID1)['ObjectInfo'];
//if ($Debug) echo "CleanUp1: ".$IP1." ".$VarID1."
";
if ( time() - IPS_GetVariable($VarID1)['VariableUpdated'] > $Cleanup*3600*24 ) { // Lösche nicht geänderte Einträge älter als..
if ($Debug) echo $IP." (".$VarID1.") wird gelöscht.";
IPS_DeleteVariable($VarID1);
}
if ( time() - IPS_GetVariable($VarID1)['VariableUpdated'] > 40 ) { // Wenn Variable nicht aktualisiert wurde, Offline setzen..
if ($Debug) echo $IP." (".$VarID1.") wird Offline gesetzt
";
SetValue($VarID1, false);
}
foreach(IPS_GetChildrenIDs($Instanz) as $VarID2) { // Suche ob schon ein Eintrag mit dieser IP besteht, wenn ja den älteren löschen
//$IP2 = mb_substr(IPS_GetName($VarID2), 0, 15);
$IP2 = IPS_GetObject($VarID2)['ObjectInfo'];
if ( $VarID1 !== $VarID2 && $IP1 === $IP2) {
if ($Debug) echo "CleanUp2: ".$IP2." ".$VarID2."
";
if (time() - IPS_GetVariable($VarID2)['VariableUpdated'] > time() - IPS_GetVariable($VarID1)['VariableUpdated']) {
IPS_DeleteVariable($VarID2);
} else {
IPS_DeleteVariable($VarID1);
}
}
}
}
}
function IP_Cidr($IP) {
return implode('.', array_map(function ($entry) {
return str_pad($entry, 3, '0', STR_PAD_LEFT);
}, explode('.', $IP)));
}