Hallo,
ich habe mir das alles mal durchgelesen und will auch mal ein bisschen antworten, also
Der gute Tipp war der verweis auf nmap, damit löst du das problem sofort, wenn das alles mit ping geschehen soll, dann gibt es ein paar möglichkeiten,
die 1. wäre ein broadcast-ping, z.B ping -b 192.168.0.255, der funktioniert aber seit einiger Zeit nicht mehr, da auf aktuellen Systemen die Antwort auf Broadcastrufe per default abgestellt ist.
die 2. wäre ein ping auf alle hosts des subnetzes, das kann eine Weile dauern, das ist schon korrekt, es handelt sich hier aber um ein Multitasking-system und man kann mehrere befehle quasi zugleich absenden, und muss nicht warten, bis der befehl ausgeführt ist. das könnte z.B. so aussehen:
|
Quellcode
|
1
2
3
4
5
|
#!/bin/bash
for ADDR in $( seq 1 254 )
do
ping -c1 -w1 192.168.0.${ADDR} &> /dev/null &
done
|
das läuft relativ fix durch, denn das angehängte & schickt alle pings in den Hintergrund.
Jetzt musst du natürlich testen, wann alle pings beendet sind, das machst du mit dem befehl jobs, der gibt eine Liste der laufenden Hinergrundprozesse zurück, und wenn die wieder leer ist, sind die pings durchgelaufen. Das testet man z.B. mit
|
Quellcode
|
1
2
3
4
|
while jobs | grep "Running" &> /dev/null
do
sleep 1
done
|
Die Ausgabe von jobs wird mit grep getestet, ob das wort Running vorkommt, denn dann läuft noch ein Ping. Wenn das der Fall ist, wird eine Sekunde gewartet und erneut getestet.
Wenn alles durchgelaufen ist, kannst du die Informationen aus der arb-Tabelle des Rechners lesen.
|
Quellcode
|
1
|
grep -v "00:00:00:00:00:00" /proc/net/arp
|
In der Datei /proc/net/arp lässt du nach allen Einträgen suchen, die nicht die MAC "00:00:00:00:00:00" besitzen, das sind die Rechner, die bisher Kontakt aufgenommen haben, das sollte die gesuchte Liste sein.
Also insgesamt
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/bin/bash
(
for IP in $( seq 0 254 )
do
ping -c1 -w1 192.168.0.${IP} &> /dev/null &
done
while jobs | grep "Running" &> /dev/null
do
echo -n "."
sleep 1
done
)
grep -v "00:00:00:00:00:00" /proc/net/arp
|
Ich habe den jobs-Test noch in eine Subshell gepackt, falls dein Programm noch andere Hintergrundprozesse erzeugt und das Script dadurch nicht durcheinanderkommt.
So, das sollte als TIPP reichen, denn es lässt sich noch einiges verbessern (Netzwerkmasken beachten, quota-setzen, etc...)