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

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

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

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

答案1

总体来说,nmap快速扫描网络非常有用。

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

sudo apt-get install nmap

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

nmap -sn 192.168.1.0/24

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


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

nmap -sP 192.168.1.0/24

有关更多参考资料,请参阅以下页面:

NMAP安装指南

NMAP 参考指南

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

答案2

如果你网络中的所有计算机都是 Ubuntu 或任何其他使用avahi-daemon(DNS-SD),您可以通过以下方式获取它们的详细列表(包括主机名和 IP 地址):

avahi-browse -rt _workstation._tcp

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

sudo arp-scan 192.168.1.0/24

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

答案3

读者须知:原始答案发布于不久前,当时我还在学习 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

重新审视答案

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

  • 脚本显然很慢,并ping等待主机的响应。默认情况下,ping等待两个 RTT,具体取决于您的网络拥塞程度,据我所知,TCP 协议每次都会将等待时间加倍(至少根据)。因此,我们可以ping用标志强制超时-w 1。由于我们有 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
    
  • printf命令可以重写如下:

    printf "IP %s is up\n" 192.168.0."$NUM"
    

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

  • 如果我们生成多个后台进程,则可以实现更好的性能改进。下面的脚本编辑正是这样做的。我将pingprintf放入一个函数中pingf(是的,我知道这个名字很老套)。现在,还有一个单独的main函数可以循环和调用pingf

#!/bin/sh
# Uncomment for debugging
#set -x
pingf(){
    if ping -w 2 -q -c 1 192.168.0."$1" > /dev/null ;
    then 
        printf "IP %s is up\n" 192.168.0."$1"
    fi
}

main(){

    NUM=1
    while [ $NUM -lt 255  ];do 
        pingf "$NUM" &
        NUM=$(expr "$NUM" + 1)
    done
    wait
}

main

效果好多少?实际上还不错,只需几秒钟。

$ 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

注意事项

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

答案4

fping是一款通过 ICMP 扫描网络上多个主机的好工具。如果尚未安装,您可以通过以下方式安装:

sudo apt-get install fping

fping发送 ICMP ECHO_REQUEST 数据包,如果从主机收到 ECHO_RESPONSE,则将主机标记为 Up。

例如,要扫描子网的主机192.168.1.0/24,你可以执行以下操作:

fping -g 192.168.1.0/24

对于特定数量的主机,例如从192.168.1.15192.168.1.140

fping -g 192.168.1.15 192.168.1.140

fping具有高度可配置性,例如将发送多少个数据包、等待响应的时间、输出格式等。

检查man fping以获得更多想法。

相关内容