是否可以使用 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