Dalla man page di ping se ne evince che:
If ping does not receive any reply packets at all it will exit with code 1. If a packet count and deadline are both specified, and fewer than count packets are received by the time the deadline has arrived, it will also exit with code 1. On other error it exits with code 2. Otherwise it exits with code 0. This makes it possible to use the exit code to see if a host is alive or not.
Potresti strutturare qualcosa del genere
codice:
ping -c1 -w1 192.168.0.1 > /dev/null
Dove con "-c1" dici a ping di mandare un solo pacchetto e con "-w1" imposti un timeout di un secondo (per velocizzare la risposta sugli host spenti). Io lavorerei sul'exit status, magari inserendo tutto in un bel ciclo. Immaginando di dover controllare gli host dal 192.168.0.5 al 192.168.0.15 potrebbe essere:
codice:
#!/bin/bash
for TARGET in 192.168.0.{15..25}
do
ping -c1 -w1 $TARGET > /dev/null
if [ "$?" -eq "0" ]; then
# Almeno un host acceso, esci
exit 1
fi
done
# Spegne il server:
halt
Ricordati che lo script che ti ho fatto vedere funziona solo se su eventuali client Windows hai abilitato l'echo-reply. Se così non fosse puoi prova ad inserire un test sull'indirizzo MAC.
Il protocollo arp è una buona idea in quanto se l'host è vivo ha sempre una risposta. Tuttavia essendo un protocollo di livello 2, funziona solo se client e server sono nella stessa sottorete. Lo script diventa quindi:
codice:
#!/bin/bash -x
declare -a IPADDR=( $(echo 192.168.0.{5..15}) )
for TARGET in ${IPADDR[@]}
do
ping -c1 -w1 $TARGET > /dev/null
RES=$(arp -a $TARGET | awk '{print $4}')
if [ "$RES" != "<incomplete>" ]; then
# Almeno un host acceso, esci
exit 1
fi
done
# Spegne il server:
halt