如何查找网络上所有使用过的 IP 地址

106 networking

在我的工作中有很多电脑,我想开个玩笑。我可以通过网络关闭计算机,但对我来说很难找到 IP 地址。

如何轻松找到从 192.168.1.aa 到 192.168.1.zz 的所有在线 IP 地址?

Kev*_*wen 157

通常,nmap对于快速扫描网络非常有用。

要安装 nmap,请在终端中输入以下命令:

sudo apt-get install nmap
Run Code Online (Sandbox Code Playgroud)

安装应用程序后,输入以下命令:

nmap -sn 192.168.1.0/24
Run Code Online (Sandbox Code Playgroud)

这将显示哪些主机响应了 192.168.1.0 和 192.168.1.255 之间网络上的 ping 请求。


对于旧版本的 Nmap,请使用-sP

nmap -sP 192.168.1.0/24
Run Code Online (Sandbox Code Playgroud)

有关其他参考资料,请参阅以下页面:

NMAP 安装指南

NMAP 参考指南

这是一个非常有用的学习工具。

  • 注意,要加速 nmap 扫描,您应该添加 -T4(速度)和 -n(仅限数字)标志。 (5认同)
  • 这对我来说足够了,它可以在互联网上运行 (3认同)
  • 请记住,nmap 命令需要 **sudo**,否则返回零结果。 (3认同)
  • 并非所有主机都响应 ping。ARP 是可行的方法,至少在 IPv4 中是这样。 (2认同)

Eri*_*lho 43

如果您网络中的所有计算机都是 Ubuntu 或任何其他使用avahi-daemonDNS-SD)的发行版,您可以通过执行以下操作获得它们的详细列表(带有主机名和 IP 地址):

avahi-browse -rt _workstation._tcp
Run Code Online (Sandbox Code Playgroud)

如果您想知道网络中使用的所有 IP 地址,您可以使用arp-scan

sudo arp-scan 192.168.1.0/24
Run Code Online (Sandbox Code Playgroud)

由于默认情况下未安装它,因此您必须使用sudo apt-get install arp-scan. arp-scan将 ARP 数据包发送到本地网络并显示收到的响应,因此它甚至可以显示受防火墙保护的主机(基于 IP 数据包阻止流量)。

  • 就我而言,`arp-scan` 经常找不到与我的无线网络相关联的所有设备。现在,例如,`sudo arp-scan 192.168.2.0/24` 显示 2 个结果(.1 和 .1),而 `nmap -sn 192.168.2.0/24` 显示 4 个结果(.1、.2、.3 .4)。因此,似乎 `nmap` 更准确(我确定有 4 个设备连接到网络)。为什么是这样? (4认同)
  • 这个命令肯定比上面的好。运行 nmap 需要很长时间,但是这个人立即回复了指定网络中的节点。 (3认同)
  • 也许我在另一个问题的评论中找到了答案。“应该注意的是,某些设备可能不会出现,除非它们打开。除非屏幕打开,否则我的 nexus 4 不会出现。” 然而,有趣的是相同的设备总是响应来自 `nmap` 的 ping。 (2认同)

Ser*_*nyy 18

读者请注意:原答案已在不久前发布,当时我只是在学习 shell 脚本。请参阅下面重新访问的版本,以获取执行速度更快的新改进脚本。

原答案

nmap将是我的第一选择,但如果你没有它怎么办?DIY 方法是使用 ping 脚本手动遍历网络上的每个可能的 IP 地址。我们这里只有while循环,我们设置地址中的最后一个数字,对地址进行静默单ping,检查命令是否成功(如果成功,则主机显然已启动)和printf语句。快速而肮脏的方式,我花了大约 10 分钟来编写它,但是运行时可能会有点慢。

#!/bin/sh
# set -x
NUM=1

while [ $NUM -lt 256  ];do 
    ping -q -c 1 192.168.0.$NUM > /dev/null 
    RESULT=$(echo $?)
    if [ $RESULT -eq 0 ]; then 
        printf 192.168.0.$NUM"\n"
    fi
    NUM=$(expr $NUM + 1)
done
Run Code Online (Sandbox Code Playgroud)

重温答案

我最初在 2015 年 8 月发布了这个答案。从那时起,我对 shell 脚本有了更多的了解,当我看到这个脚本时,我认为重新访问这个答案以添加一些改进是个好主意。这里有一些想法:

  • 该脚本显然很慢并ping等待主机的响应。默认情况下,ping对于两个 RTT,这取决于您的网络拥塞程度,据我所知,TCP 协议每次都会将等待时间加倍(至少根据this)。所以我们可以ping-w 1flag强制超时。由于我们有 256 个地址,并且我们假设每个地址需要 1 秒,因此脚本大约需要 256/60 = 4.27 分钟。

  • 执行命令然后捕获其退出状态$?并不是真正必要的。在if ... then;...fi可以在命令直接操作。换句话说,这样做就足够了:

    if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
    then
         <some other code here>
    fi
    
    Run Code Online (Sandbox Code Playgroud)
  • printf命令可以改写为:

    printf "IP %s is up\n" 192.168.0."$NUM"
    
    Run Code Online (Sandbox Code Playgroud)

    这更像是一种风格变化,但它与printf许多其他语言的工作方式和外观一致,带有引用"$NUM"变量。这里没有必要引用——因为我们只处理数字,我们不需要预测由于变量中有空格而导致的分词。

  • 如果我们生成多个后台进程,可以实现更好的性能改进。下面的脚本编辑正是这样做的。我把pingand printf放到一个函数中,pingf(是的,老生常谈的名字,我知道)。现在,还有一个main函数可以循环和调用pingf.

if ping -w 1 -q -c 1 192.168.0.$NUM > /dev/null ;
then
     <some other code here>
fi
Run Code Online (Sandbox Code Playgroud)

这有多好?实际上,还不错,只需几秒钟。

$ time ./ping_script.sh                                                                      
IP 192.168.0.1 is up
IP 192.168.0.101 is up
IP 192.168.0.27 is up
IP 192.168.0.29 is up
    0m02.50s real     0m00.01s user     0m00.12s system
Run Code Online (Sandbox Code Playgroud)

要记住的事情

  • Windows(我认为从 Windows 7 开始)已经开始阻止对 ICMP 回声请求的响应。在 Ask Ubuntu 和其他类似的网站上有很多关于此的问题“嘿,我的 Linux 计算机可以被 ping,但 Windows 计算机不能,这是怎么回事?” 请注意,对于较新的 Windows 版本,您确实需要启用对 ICMP 回声的响应。

  • 我喜欢这种解决方案 (4认同)

小智 16

Netdiscover 可以是您的答案。

通过终端安装:

sudo apt-get install netdiscover
Run Code Online (Sandbox Code Playgroud)

示例用法:

sudo netdiscover -r 192.168.1.0/24 -i wlan0
Run Code Online (Sandbox Code Playgroud)

带有 MAC 地址的 IP 将显示在您的终端上。看截图

在此处输入图片说明

希望能帮到你

参考