Pergunta antiga que conheço, mas, minha solução (encontrei a pergunta no Google ao procurar uma solução para meu problema) ...
No meu PI de framboesa, crie um script da seguinte forma:
#!/bin/bash
SUBNET=192.168.1.
FOUT=/mnt/sda/inbound/hosts.state
FSTATE=/tmp/host.state
for i in 'seq 1 255';
do
IP=${SUBNET}${i}
sudo nmap -sP ${IP} | grep "Host up" >/dev/null
HOSTSTATE=1
MAC=1
if [ $? -eq 0 ]; then
MAC=$(sudo nmap -sP -n ${IP} | grep MAC | cut -d ' ' -f3)
DATETIME=$(date)
HOSTSTATE="${IP},${MAC},up"
else
HOSTSTATE="${IP},,down"
fi
if [ -z "${MAC}" ]; then
## HACK FOR grep NOT RETURNING CORRECT EXIT CODE
HOSTSTATE="${IP},,down"
fi
OLDSTATE=""
if [ -f ${FSTATE} ]; then
OLDSTATE=$(grep ${IP} ${FSTATE} 2>/dev/null)
fi
if [ -z "${OLDSTATE}" ]; then
OLDSTATE=${IP},,unknown
fi
if [ "${OLDSTATE}" != "${HOSTSTATE}" ]; then
STATE1=$(echo ${OLDSTATE} | cut -d ',' -f3)
STATE2=$(echo ${HOSTSTATE} | cut -d ',' -f3)
CHANGE="from ${STATE1} to ${STATE2}"
CHANGEMSG="${IP},${MAC} changed ${CHANGE} at $( date )"
echo ${CHANGEMSG} >> ${FOUT}
grep -v ${IP} ${FSTATE} >> ${FSTATE}.tmp
echo ${HOSTSTATE} >> ${FSTATE}.tmp
mv ${FSTATE}.tmp ${FSTATE}
fi
done
Em seguida, edite o crontab do usuário por crontab -e
, defino-o para:
0,30 * * * * /opt/scripts/checkHostActivity
Finalmente, adicione o usuário aos sudoers para permitir que eles executem os comandos do nmap.
Job jobbed. A cada 30 minutos, examino a rede para ver quais hosts estão ativos e escrevo as alterações em /mnt/sda/inbound/host.state