Portál AbcLinuxu, 3. prosince 2025 15:59
Záleží, co od toho přesně chceš. Nejjednodušší varianta (s ohledem na zátěž serveru a potřebné zásahy) je využít log DHCP serveru. Tj. budeš tam mít kdy si jaký klient žádal o adresu, kdy mu byla která přidělena a kdy ji uvolnil. Samozřejmě je to důvěryhodné natolik, nakolik lze věřit klientům, že se řídí DHCPkem. Navíc ti tam může chybět zpráva o uvolnění adresy pokud jej klient při vypnutí nepošle (pád systému apod.). Ale přinejmenším při příštím přiřazení téhle IP se to pořeší.
Další možností je prostě logovat si ARP cache. (příkazy arp, resp. ip ne; pokud by ti nestačila velikost cache jádra, tak třeba arpd). Výhodou je opět zcela pasivní chování a navíc dost dobrá spolehlivost. Nevidíš tím sice zapnuté počítače, které aktuálně nekomunikují, ale otázkou je, jestli jsou takové vůbec zajímavé.
Ping – no pokud už chceš pingat, tak pokud možno přes ARP ping (umí třeba nmap, pokud je spuštěný s root právy). Výhodou je, že ARP nemůže blokovat žádný firewall, pokud má počítač rozumně fungovat (resp. jo, může mít fixní ARP tabulku, ale to už je trochu mimo normální situace).
#!/bin/bash
# tento skript je delan na to aby ho spustel cron po nejakych
# rozumnych intervalech napr. 15 min
# vkladejte adresy oddelene novym radkem viz. dale
ip_range="
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.5"
nmap -sP $ip_range -oG IP_temp &> /dev/null
### !!! pokud budete chtit casem pridat adresu do rozsahu pridejte ji do
### !!! promenne $ip_range i do souboru lastping
# zkontroluje jestli existuje soubor lastping
# pokud ne vytvori se a ulozi se do nej adresy z ip_range
if [ ! -f lastping ]; then
touch lastping
declare -a ip
ip=(`echo $ip_range | tr ' ' ' '`)
for each in ${ip[@]}; do
echo "$each" >> lastping
done
fi
# rozparsuje vystup z nmapu a vybere z nej uspesne pingnute ip adresy
while read line; do
echo $line | egrep "Status: Up" | egrep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" >> IP_temp2
done < IP_temp
# funkce vraci informaci o poslednim pingu
# pracuje ze souborem lastping
# jeden parametr ip adresa
function getLastPing() {
hlp=0
while read line; do
if [ "$line" = "$1" ]; then
hlp=1
fi
done < lastping
if [ $hlp == 1 ]; then
echo "1"
return 0
fi
echo "0"
return 0
}
# nacteme promenne s casem
min=`date +%M`
hour=`date +%H`
day=`date +%d`
month=`date +%m`
year=`date +%Y`
# pro kazdou uspesne pingnutou ip ulozi do souboru pojmenovaneho podle ip
# bud cas pokud minuly ping selhal nebo hvezdicku pokud v pingoovani pokracujeme
while read ip; do
# zjistime info o poslednim pingu
lastping=`getLastPing $ip`
# pokud soubor s ip neexistuje
if [ ! -f $ip ]; then
# vytvorime ho
touch $ip
# a na prvni radek pridame info o zacatku testovani
# a info o last pingu nas asi moc nezajima, takze ulozime cas
echo -n "$day.$month.$year $hour:$min " >> $ip
# pokud existuje soubor s ip
else
# zkontrolujeme jestli nezacina novy den
if [ `tail -1 $ip | egrep -c "$day.$month.$year"` == 0 ]; then
# zacal novy den
# porovname lastping
if [ $lastping == 1 ]; then
# pokracujeme takze dame hvezdicku
echo -n "$day.$month.$year *" >> $ip
else
# nepokracujeme takze dame cas
echo -n "$day.$month.$year $hour:$min " >> $ip
fi
else
# novy den nezacal
if [ $lastping == 1 ]; then
# pokracujeme takze dame hvezdicku
echo -n "*" >> $ip
else
# nepokracujeme dame cas
echo -n " $hour:$min " >> $ip
fi
fi
fi
done < IP_temp2
# uklada info o uspesne pinglych adresach do lastping
touch hlpfile
while read line; do
hlp=0
pureIP=`echo "$line" | egrep -o "[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}"`
while read ip; do
if [ "$pureIP" = "$ip" ]; then
hlp=1
fi
done < IP_temp2
if [ $hlp == 1 ]; then
echo $pureIP >> hlpfile
else
echo "$pureIP !" >> hlpfile
fi
done < lastping
## uklid ##
mv hlpfile lastping
rm IP_temp IP_temp2
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.