问题描述
在我的工作中有很多电脑,我想开个玩笑。我可以通过网络关闭计算机,但找到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
有关其他参考,请参阅以下页面:
这是一个非常有用的学习工具。
次佳解决办法
如果网络中的所有计算机都是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将显示在您的终端上。查看截图
希望能帮助你
第四种办法
读者注意:原来的答案已经发布了一段时间之前和我只学习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,因为变量中有空格。 -
如果我们生成多个后台进程,可以实现更好的性能提升。下面的脚本编辑正是如此。我将
ping
和printf
放入一个函数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.15
到192.168.1.140
:
fping -g 192.168.1.15 192.168.1.140
fping
具有高度可配置性,例如将发送多少个数据包,等待响应的时间,输出格式等。
检查man fping
以获得更多想法。