note/tech/nmap_mac_ip.sh
2025-11-19 10:16:05 +08:00

56 lines
2.2 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 缓存。"