当前位置: 首页>>技术教程>>正文


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

,

问题描述

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

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

最佳解决办法

通常,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 Installation Guide

NMAP Reference Guide

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

次佳解决办法

如果网络中的所有计算机都是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-scan进行安装。 arp-scan将ARP数据包发送到本地网络并显示收到的响应,因此它甚至显示防火墙主机(基于IP数据包阻止流量)。

第三种解决办法

Netdiscover可以作为您的答案。

要通过终端安装:

sudo apt-get install netdiscover

示例用法:

sudo netdiscover -r 192.168.1.0/24 -i wlan0

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

networking,ubuntu

希望能帮助你

reference

第四种办法

读者注意:原来的答案已经发布了一段时间之前和我只学习shell脚本的时候。请参阅下面重新访问的版本,以获得执行速度更快的新脚本。

原始答案

nmap将是我的第一选择,但是如果你没有它呢? DIY方式将使用ping脚本,手动通过网络上的每个可能的IP地址。我们在这里只是while循环,我们在地址中设置最后一个数字,对地址进行静默单一ping,检查命令是否成功(如果它成功,那么主机显然是up),以及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协议每次都会使等待时间加倍(至少根据this)。因此我们可以强制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"变量。这里没有必要引用 – 因为我们只处理数字,所以我们不需要预测word-splitting,因为变量中有空格。

  • 如果我们生成多个后台进程,可以实现更好的性能提升。下面的脚本编辑正是如此。我将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 echo的响应。

第五种办法

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

sudo apt-get install fping

如果从主机获得ECHO_RESPONSE,则fping发送ICMP ECHO_REQUEST数据包并将主机标记为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以获得更多想法。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1047.html,未经允许,请勿转载。