我的工作中有很多电脑,我想开个玩笑。我可以通过网络关闭计算机,但是很难找到IP地址。
如何轻松找到从192.168.1.aa到192.168.1.zz的所有在线IP地址?
我的工作中有很多电脑,我想开个玩笑。我可以通过网络关闭计算机,但是很难找到IP地址。
如何轻松找到从192.168.1.aa到192.168.1.zz的所有在线IP地址?
Answers:
通常,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数据包阻止流量)。
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个设备)。为什么是这样?
nmap
。
arp-scan
很好!
读者注意:最初的答案已经发布了一段时间,当时我只是在学习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"
不同,这与许多其他语言的工作方式和外观保持一致。这里没有必要报价-因为我们只处理数字,所以由于变量中有空格,因此不需要预料单词拆分。
如果我们生成几个后台进程,则可以实现更好的性能改进。下面的脚本编辑正是这样做的。我将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
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.15
到192.168.1.140
:
fping -g 192.168.1.15 192.168.1.140
fping
高度可配置,例如将发送多少个数据包,等待响应的时间,输出格式等。
检查man fping
以获得更多想法。
angry ip scanner