我的工作中有很多电脑,我想开个玩笑。我可以通过网络关闭电脑,但查找 IP 地址对我来说很难。
如何轻松找到从 192.168.1.aa 到 192.168.1.zz 的所有在线 IP 地址?
答案1
答案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-scan
。arp-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"
变量的工作方式和外观一致。这里不需要引用 - 因为我们只处理数字,所以我们不需要预料到由于变量中有空格而导致的分词。如果我们生成多个后台进程,则可以实现更好的性能改进。下面的脚本编辑正是这样做的。我将
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 回显的响应。
答案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.15
到192.168.1.140
:
fping -g 192.168.1.15 192.168.1.140
fping
具有高度可配置性,例如将发送多少个数据包、等待响应的时间、输出格式等。
检查man fping
以获得更多想法。