我的 Debian 机器上有一个 NIC 卡。机器已关闭,但我需要知道网卡是否已打开,以便稍后(从另一台 Debian 机器)发送唤醒 LAN 魔术包来唤醒它。我有卡的MAC地址。有什么方法可以通过 MAC ping 以太网卡以查看其是否打开吗?
我尝试创建一个 ARP 条目:
arp -s 192.168.2.2 00-0c-0d-ef-02-03
ping 192.168.2.2
但这不起作用,因为网卡没有这个 IP 地址。因此网卡会收到 ping 请求但不会回复它。有没有办法解决?
我正在使用 etherwake 包发送 LAN 唤醒消息。
答案1
如果使用该工具,您的运气可能会更好arping
。该工具ping
工作在第 3 层开放系统互连模型,而arping
在第 2 层工作。
然而,使用此工具您仍然需要知道系统的 IP。它有 2 个版本,大多数 Unix(Alexey Kuznetsov 的)包含的标准版本是只能处理 IP 地址的版本。这其他版本(Thomas Habets)据说可以使用 MAC 地址进行查询。
$ sudo arping 192.168.1.1 -c 1
ARPING 192.168.1.1 from 192.168.1.218 eth0
Unicast reply from 192.168.1.1 [00:90:7F:85:BE:9A] 1.216ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
arping
工作原理与此类似,ping
只是它不发送 ICMP 数据包,而是发送 ARP 数据包。
仅使用 MAC 获取系统的 IP
以下是进行 MAC 到 IP 反向查找的几种方法。
地图
$ nmap -sP 192.168.1.0/24
然后在你的 arp 缓存中查找相应的机器
arp -an
。平
$ fping -a -g 192.168.1.0/24 -c 1
然后查看你的 arp 缓存,与上面相同。
平
$ ping -b -c1 192.168.1.255
然后查看你的 arp 缓存,与上面相同。
nbtscan(仅限 Windows 主机)
$ nbtscan 192.168.1.0/24 Doing NBT name scan for addresses from 192.168.1.0/24 IP address NetBIOS Name Server User MAC address ------------------------------------------------------------------------------ 192.168.1.0 Sendto failed: Permission denied 192.168.1.4 MACH1 <server> <unknown> 00-0b-12-60-21-dd 192.168.1.5 MACH2 <server> <unknown> 00-1b-a0-3d-e7-be 192.168.1.6 MACH3 <server> <unknown> 00-21-9b-12-b6-a7
答案2
答案3
该ether-wake
命令将通过 MAC 地址工作,因此您肯定 (a) 不需要 IP 地址,并且 (b) 可以无害地发送命令(如果它已经唤醒,唤醒它不会有影响吗?)
arp -an
您可以通过使用grep 获取您的 MAC 来获取目标主机的 IP,从而查看现有的 arp 缓存列表。然而,因为 arp 是一个缓存,所以它可能已经“超时”了缓存(并且仍然处于“唤醒”状态)。然后你可能需要使用暴力方法来找到它的IP,例如:
sudo nmap -sP 192.168.2.0/24 | less
(然后寻找 00:0c:0d:ef:02:03) - 前提是防火墙和其他类似的东西不会妨碍!
答案4
这是一个通过 mac 地址 ping 的简单脚本。只需保存并运行例如
macping aa:bb:cc:dd:ee:ff
您还可以以菊花链方式连接结果以有条件地执行其他操作,例如:
macping aa:bb:cc:dd:ee:ff && echo do something if online || echo do something if offline
-
#!/bin/bash
network=192.168.1.1/24
if [ "$#" -ne 1 ]; then echo Usage example: $0 aa:bb:cc:dd:ee:ff; exit 2; fi;
nmap -sP $network >& /dev/null
ip=$(arp -n | grep $1 | awk ' { print $1 }')
ping $ip -n -q -c 2 -i 0.2 -w 1 >& /dev/null
if [ $? -eq 0 ]; then
echo Device is online \($ip\)
else
echo Device is offline
exit 1
fi;