61 lines
2.3 KiB
Bash
61 lines
2.3 KiB
Bash
#!/bin/bash
|
|
|
|
echo "--- 步骤 1: 正在尝试自动检测本地 IP ---"
|
|
|
|
# 1. 尝试使用 ip 或 ifconfig 命令获取本地 IP 地址
|
|
# 优先使用 ip (Linux 常用),其次使用 ifconfig (macOS 常用)
|
|
if command -v ip &>/dev/null; then
|
|
# Linux 方式:排除环回地址,只取第一条结果,并去除 /CIDR 部分
|
|
LOCAL_IP=$(ip addr show | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | cut -d/ -f1 | head -n 1)
|
|
elif command -v ifconfig &>/dev/null; then
|
|
# macOS 方式:排除环回地址,只取第一条结果
|
|
LOCAL_IP=$(ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | head -n 1)
|
|
else
|
|
echo "错误: 找不到 ip 或 ifconfig 命令。无法确定本地 IP,请手动检查网络配置。"
|
|
exit 1
|
|
fi
|
|
|
|
# 检查是否成功获取 IP
|
|
if [ -z "$LOCAL_IP" ]; then
|
|
echo "错误: 未能找到有效的本地 IP 地址 (非 127.0.0.1)。"
|
|
exit 1
|
|
fi
|
|
|
|
# 2. 提取网段前缀 (例如 192.168.1.100 -> 192.168.1.)
|
|
# ${LOCAL_IP%.*} 使用 Shell 参数扩展来移除最后一个点之后的所有字符
|
|
NETWORK_PREFIX="${LOCAL_IP%.*}."
|
|
|
|
echo "✅ 已检测到本地 IP: ${LOCAL_IP}"
|
|
echo "▶️ 开始扫描网段: ${NETWORK_PREFIX}1 到 ${NETWORK_PREFIX}254"
|
|
echo "------------------------------------------------------"
|
|
|
|
# 3. 遍历 ping 扫描
|
|
# -c 1: 发送 1 个包
|
|
# 超时:Linux (iputils) 的 -W 为秒;macOS 的 -W 为毫秒,需区分
|
|
# >/dev/null 2>&1: 丢弃所有输出
|
|
# &: 在后台运行,以并行加速扫描
|
|
if [ "$(uname -s)" = "Darwin" ]; then
|
|
PING_WAIT=( -W 1000 )
|
|
else
|
|
PING_WAIT=( -W 1 )
|
|
fi
|
|
for i in {1..254}; do
|
|
ping -c 1 "${PING_WAIT[@]}" "${NETWORK_PREFIX}${i}" >/dev/null 2>&1 &
|
|
done
|
|
|
|
# 4. 等待所有后台 ping 任务完成
|
|
# 这一步是确保所有 Ping 完成后,ARP 表才会被完整填充
|
|
wait
|
|
|
|
echo "------------------------------------------------------"
|
|
echo "✅ Ping 扫描完成。正在检查 ARP 表以显示活跃主机..."
|
|
|
|
# 5. 检查 ARP 表以获取活跃 IP 和 MAC 地址
|
|
# -a: 显示所有 ARP 条目
|
|
# grep -v "incomplete": 排除未解析成功的条目
|
|
# grep -F "${NETWORK_PREFIX}": 用完整前三段前缀(含末尾点)匹配,避免 192.168.1 误匹配 192.168.10.x
|
|
arp -a | grep -v "incomplete" | grep -F -- "${NETWORK_PREFIX}"
|
|
|
|
echo "------------------------------------------------------"
|
|
echo "扫描结束。"
|