56 lines
2.2 KiB
Bash
56 lines
2.2 KiB
Bash
#!/bin/bash
|
||
|
||
# --- 配置 ---
|
||
NETWORK_PREFIX="192.168.112"
|
||
PORT_TO_SCAN=22
|
||
NETWORK_RANGE="${NETWORK_PREFIX}.1-254" # nmap 需要的范围格式
|
||
|
||
echo "正在使用 nmap 扫描网络范围: ${NETWORK_RANGE}"
|
||
echo "查找TCP端口 ${PORT_TO_SCAN} 打开的主机..."
|
||
echo "然后使用 arp 查询其 MAC 地址 (macOS)..."
|
||
echo "--------------------------------------------------"
|
||
printf "%-18s %-20s\n" "IP 地址" "MAC 地址"
|
||
echo "--------------------------------------------------"
|
||
|
||
# 步骤 1: 使用 nmap 获取开放了指定端口的 IP 地址列表
|
||
# 使用您提供的、经过验证可以工作的 awk 命令来提取 IP
|
||
# 因为 nmap 命令已经通过 -p ${PORT_TO_SCAN} --open 进行了筛选,
|
||
# 所以这里的 /open/ 实际上指的就是我们关心的端口
|
||
nmap -n -Pn -p "${PORT_TO_SCAN}" --open "${NETWORK_RANGE}" -oG - | \
|
||
awk '/\/open\// {print $2}' | \
|
||
while read -r ip_address; do
|
||
if [[ -z "$ip_address" || ! "$ip_address" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||
# 如果是空行或者不是合法的IP格式,则跳过
|
||
# awk 的 $2 有时可能会取到非IP字符,如果行结构不完全符合预期
|
||
continue
|
||
fi
|
||
|
||
mac_address="N/A (未获取到)" # 默认值
|
||
|
||
# 步骤 2: 对每个 IP 地址使用 arp 查询 MAC 地址 (macOS 特定)
|
||
arp_result=$(arp -n "$ip_address" 2>/dev/null)
|
||
|
||
if [[ -n "$arp_result" ]]; then
|
||
if echo "$arp_result" | grep -q -- "-- no entry"; then
|
||
mac_address="N/A (no ARP entry)"
|
||
elif echo "$arp_result" | grep -q "at (incomplete)"; then
|
||
mac_address="N/A (incomplete)"
|
||
else
|
||
potential_mac=$(echo "$arp_result" | awk '/ at / {print $4}')
|
||
if [[ "$potential_mac" =~ ^([0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}$ ]]; then
|
||
mac_address="$potential_mac"
|
||
else
|
||
mac_address="N/A (ARP parse error)"
|
||
fi
|
||
fi
|
||
else
|
||
mac_address="N/A (no ARP output)"
|
||
fi
|
||
|
||
# 步骤 3: 显示 IP 和 MAC 地址
|
||
printf "%-18s %-20s\n" "$ip_address" "$mac_address"
|
||
done
|
||
|
||
echo "--------------------------------------------------"
|
||
echo "扫描完成。"
|
||
echo "提示: MAC 地址的获取依赖于本地 ARP 缓存。" |