当我执行 arp -a 时,我希望看到设备的名称。据我所知,没有选项可以直接使用 arp 执行此操作。所以我认为也许可以对检索到的每个 ip 执行 nslookup。我对 shell 不太了解,我只是认为我可以使用管道运算符
arp -a | nslookup
但它产生了这样的结果:
> > Unrecognized command: Interfaccia: 192.168.176.1 --- 0x5
> Unrecognized command: Indirizzo Internet Indirizzo fisico Tipo
> Unrecognized command: 192.168.176.255 ff-ff-ff-ff-ff-ff statico
> Unrecognized command: 224.0.0.22 01-00-5e-00-00-16 statico
> Unrecognized command: 224.0.0.251 01-00-5e-00-00-fb statico
显然它是以字符串形式传递的。是否可以使用 for 循环?
我曾见过这些: 在 Windows 上通过 MAC 地址获取主机名
但他们似乎建议对感兴趣的 IP 手动执行 nslookup,或者使用 nmap。
感谢您的任何帮助!
答案1
回答
我也研究过同样的事情。有一个 powershell 等效程序叫做Get-NetNeighbor
。你可以将以下内容粘贴到 powershell 中,它会执行你想要的操作。
# Equivalent to ARP
Get-NetNeighbor -AddressFamily IPv4 | %{
# For each arp entry, get the address and resolve its hostname
$entry = @{
IPAddress=$_.IPAddress;
Hostname=(Resolve-DnsName -QuickTimeout $_.IPAddress 2>null).Namehost;
}
# Pack the results into a PS Object for cleaner workable output
new-object psobject -property $entry;
}
解释
将其分解成几个部分:
获取NetNeighbor:这相当于 ARP,但由于它是一个 powershell 对象,所以它的输出更易于使用。
$entry:保存 IP 地址和主机名的自定义对象。
解析 DNS 名称:这相当于 nslookup,虽然没有那么快,但我使用了 -QuickTimeout 标志
2>空:相当于
-ErrorAction SilentlyContinue
标志,如果没有主机名,我们就不会收到错误。新对象 psobject:这就是 $entry 被打包成更清晰、更可行输出的内容。
例子
按原样运行命令的结果:
> Get-NetNeighbor -AddressFamily IPv4 | %{
>> # For each arp entry, get the address and resolve its hostname
>> $entry = @{
>> IPAddress=$_.IPAddress;
>> Hostname=(Resolve-DnsName -QuickTimeout $_.IPAddress 2>null).Namehost;
>> }
>> # Pack the results into a PS Object for cleaner workable output
>> new-object psobject -property $entry;
>> }
IPAddress Hostname
--------- --------
224.0.0.22 igmp.mcast.net
224.0.0.2 all-routers.mcast.net
224.0.0.22 igmp.mcast.net
224.0.0.2 all-routers.mcast.net
255.255.255.255
239.255.255.250
224.0.0.252
224.0.0.251
224.0.0.22 igmp.mcast.net
224.0.0.2 all-routers.mcast.net
10.0.0.255
10.0.0.118
10.0.0.100 tools.localhost
10.0.0.79
10.0.0.60
10.0.0.28
10.0.0.15
10.0.0.1
239.255.255.250
224.0.0.251
224.0.0.22 igmp.mcast.net
224.0.0.2 all-routers.mcast.net
从这里您可以使用where {}
或select-string
等获得更具体的结果。