如何使用 bash 脚本发现网络中的 IP 地址?

如何使用 bash 脚本发现网络中的 IP 地址?

是否可以使用 bash 脚本确定网络内系统的 IP 地址?如何操作?

答案1

安装 arp-scan ( sudo apt-get install arp-scan) 并将以下行添加到脚本中:

IPs=$(sudo arp-scan --localnet --numeric --quiet --ignoredups | grep -E '([a-f0-9]{2}:){5}[a-f0-9]{2}' | awk '{print $1}')

现在,变量中拥有了所有活动的 IP 地址IPs

注意:这只在直接连接的网络上有效,即不能通过路由器访问。

PS:如果你安装gawk命令可以缩短为(感谢贝拉夸):

IPs=$(sudo arp-scan --localnet --quiet --ignoredups | gawk '/([a-f0-9]{2}:){5}[a-f0-9]{2}/ {print $1}')

答案2

该答案使用nmap命令来收集网络中活动主机的信息。

Nmap(“网络映射器”)是一款用于网络探索和安全审计的开源工具。它旨在快速扫描大型网络,尽管它对单个主机也很好用。Nmap 以新颖的方式使用原始 IP 数据包来确定网络上有哪些主机可用、这些主机提供哪些服务(应用程序名称和版本)、它们运行的​​操作系统(和操作系统版本)、正在使用的数据包过滤器/防火墙类型,以及许多其他特性。

假设您需要扫描 192.168.0.X 范围,您可以尝试:

nmap -v -sP 192.168.0.0/24

其中192.168.0.0是网络地址,/24是网络掩码,相当于255.255.255.0。因此上述命令将扫描 256 个主机。

要收集活动的 IP 地址,可以使用以下行:

IPS_UP=$(nmap -nsP 192.168.0.0/24 2>/dev/null -oG - | grep "Up$" | awk '{printf "%s ", $2}')

它实际上将活动 IP 地址列表(经 过滤grep)连接成一个名为 的变量IPS_UP

  • nmap-n使用开关(无名称解析)、-sP(ping 扫描)运行-oG并将 grep 可处理输出输出到标准输出(-)。
  • grep仅过滤行尾包含单词“Up”(“$”)的行。
  • awk打印输出列表的第二列nmap,即 IP 地址,并附加一个空格。
  • 命令$()替换允许将命令链的输出分配给变量IPS_UP

可以使用 安装网络映射器sudo apt-get install nmap

笔记
nmap如果由特权用户运行,可能会发现更多主机。这是因为发送了不同类型的数据包来扫描主机。通过修改上面的行以sudo nmap ...允许nmap以 root 身份运行该命令。

答案3

显然这不是一个好主意,但我还是尝试了一下

#!/bin/bash

IP=$(ifconfig eth0 | grep Mask | cut -d ':' -f2 | cut -d " " -f1)
Mask=$(ifconfig eth0 | grep Mask | cut -d ':' -f4 | cut -d " " -f1)
IFS=.
IPArray=($IP)
MaskArray=($Mask)
NetArray=()
Start=0
Max=$(( 255 * 255 * 255 * 255 ))
for key in "${!IPArray[@]}";
do
   NetArray[$key]=$(( ${IPArray[$key]} & ${MaskArray[$key]} ))
   Start=$(( $Start + (${NetArray[$key]} << (3-$key)*8) )) 
done
IFS=
echo "Your IP Address   : $IP"
echo "Your N/W Mask     : $Mask"
echo "Your N/W Address  : ${NetArray[@]}"
echo "IPs to be Checked : $(( $Max - $Start ))"
for ((IPs=$Start; IPs <= $Max; IPs++))
do 
   IP=$(( IPs >> 24 ))
   IP="$IP.$(( (IPs >> 16) & 255 ))"
   IP="$IP.$(( (IPs >> 8) & 255 ))"
   IP="$IP.$(( IPs & 255 ))"
   $(ping -c 1 -w 1 $IP >& /dev/null)
   if [[ $? -eq 0 ]]; then
      echo "$IP exists in Network. Just $(( $Max - $IPs )) more to go."
   fi
done

相关内容