我一直在开发一组在 (Ubuntu) Linux 机器上的 Apache 服务器上运行的 PHP 页面,这些页面会返回有关我的 LAN 上设备的状态和信息。所做的一件事是进行简单的 ping 测试,以确定设备相对于 LAN 是否在线。
执行“ping -c 1 -w 1 host”对所有设备都有效,除了我的 Xbox 360,它似乎被锁得很紧。如果我使用“nmap -sN xbox360”,它会报告它在线,但这需要 root 权限。
有什么办法可以解决这个问题吗?我在网上找不到任何关于如何让 Xbox 360 响应 ping 的信息,有没有不需要 root 权限的东西(可以从 php 脚本运行)可以确定我的 Xbox 是否连接到 LAN?
答案1
我知道这是一个老问题,但是,我的解决方案(在 Google 中寻找问题的解决方案时发现了这个问题)...
在我的 Raspberry PI 上,创建如下脚本:
#!/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
然后通过 编辑用户 crontab crontab -e
,我将其设置为:
0,30 * * * * /opt/scripts/checkHostActivity
最后,将用户添加到 sudoers 以允许他们运行 nmap 命令。
工作已完成。每 30 分钟,我会扫描网络以查看哪些主机处于运行状态,并将所有更改写入 /mnt/sda/inbound/host.state