From 01998497e3a4fb0487e2d898362ab77fdc816ce5 Mon Sep 17 00:00:00 2001 From: laily Date: Sun, 17 May 2026 14:03:17 +0800 Subject: [PATCH] fix: scan-ip --- script/scan-ip.sh | 56 ++++++++++++----------------------------------- 1 file changed, 14 insertions(+), 42 deletions(-) diff --git a/script/scan-ip.sh b/script/scan-ip.sh index 7375913..ce02151 100644 --- a/script/scan-ip.sh +++ b/script/scan-ip.sh @@ -1,60 +1,32 @@ #!/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 + echo "错误: 找不到 ip 或 ifconfig 命令" && exit 1 fi -# 检查是否成功获取 IP -if [ -z "$LOCAL_IP" ]; then - echo "错误: 未能找到有效的本地 IP 地址 (非 127.0.0.1)。" - exit 1 -fi +[ -z "$LOCAL_IP" ] && echo "错误: 未能检测到本地 IP" && exit 1 -# 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" +PREFIX="${LOCAL_IP%.*}" +echo "本机 IP: $LOCAL_IP,扫描网段: $PREFIX.1-254" echo "------------------------------------------------------" -# 3. 遍历 ping 扫描 -# -c 1: 发送 1 个包 -# 超时:Linux (iputils) 的 -W 为秒;macOS 的 -W 为毫秒,需区分 -# >/dev/null 2>&1: 丢弃所有输出 -# &: 在后台运行,以并行加速扫描 +# macOS: -W 单位毫秒,-S 绑定源 IP +# Linux: -W 单位秒, -I 绑定源 IP +# 绑定源 IP 是为了防止 VPN 劫持路由导致 ping 走错网卡、ARP 不触发 if [ "$(uname -s)" = "Darwin" ]; then - PING_WAIT=( -W 1000 ) + for i in $(seq 1 254); do + ping -c 1 -W 1000 -S "$LOCAL_IP" "$PREFIX.$i" >/dev/null 2>&1 && echo "$PREFIX.$i 在线" & + done else - PING_WAIT=( -W 1 ) + for i in $(seq 1 254); do + ping -c 1 -W 1 -I "$LOCAL_IP" "$PREFIX.$i" >/dev/null 2>&1 && echo "$PREFIX.$i 在线" & + done 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 "扫描结束。" +echo "扫描完成"