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


Answers:


141

通常,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
并非所有主机都响应ping。至少在IPv4中,ARP是必经之路。
Marcin Kaminski

3
那对我来说足够了,它可以在互联网上工作

1
仅仅是我的计算机,还是该命令永远需要运行?
JohnMerlino 2014年

4
注意,要加快nmap扫描,应添加-T4(速度)和-n(仅数字)标志。
Sergiy Kolodyazhnyy 2015年

3
请记住,nmap命令需要sudo,否则将返回零结果。
machineaddict

40

如果您网络中的所有计算机都是Ubuntu或使用avahi-daemonDNS-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
此命令绝对比上面的命令好。运行nmap花费了很长时间,但是此操作立即响应了指定网络中的节点。
JohnMerlino 2014年

3
以我为例,通常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个设备)。为什么是这样?
tigerjack89 2013年

2
也许我在评论另一个问题时找到了答案。“应该注意的是,某些设备只有在打开的情况下才会显示。除非打开屏幕,否则我的nexus 4不会显示。” 但是,有趣的是,相同的设备总是响应的ping nmap
–tigerjack89

arp-scan很好!
forzagreen

17

读者注意:最初的答案已经发布了一段时间,当时我只是在学习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协议每次都会将等待时间加倍(至少根据此方法)。因此,我们可以强制标志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计算机不能被ping通,这是怎么回事?” 请注意以下事实:对于较新的Windows版本,您确实需要启用对ICMP回显的响应。

2
我喜欢这种解决方案
Szenis 2015年


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以获得更多想法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.