用nmap扫描找出某个网段下空闲的ip脚本

Linux系统下

把下面内容保存为scan_unused.sh(注意改开头的 BASE 和 NETMASK):

#!/bin/bash
set -e

NET="192.168.1.0/24"
BASE="192.168.1"

echo "[1] 生成网段所有 IP ..."
seq 1 254 | while read i; do echo "${BASE}.${i}"; done > all_ips.txt

echo "[2] 使用 nmap 扫描在线主机 ..."
nmap -sn -oG scan.gnmap "${NET}"

echo "[3] 提取在线 IP ..."
grep "Status: Up" scan.gnmap | awk '{print $2}' > live_ips.txt

echo "[4] 计算空闲 IP ..."
grep -vFf live_ips.txt all_ips.txt > unused_ips.txt

echo "扫描完成:"
echo "  在线主机: $(wc -l < live_ips.txt)"
echo "  空闲 IP:  $(wc -l < unused_ips.txt)"
echo "结果文件: live_ips.txt unused_ips.txt"

windows下

把下面内容保存为 scan_subnet.bat(注意改开头的 BASE 和 NETMASK):

@echo off
setlocal enabledelayedexpansion

:: ===== 配置网段 =====
set BASE=192.168.1
set NETMASK=255.255.255.0
:: 只扫 1-2540255 通常不作为主机地址

:: 1. nmap 主机发现(grepable 输出)
echo [1] 正在使用 nmap 扫描网段 ...
nmap -sn -oG scan.gnmap %BASE%.0/24

:: 2. 从 scan.gnmap 中提取 Status: Up 的 IP
echo [2] 提取在线 IP ...
findstr "Status: Up" scan.gnmap > live_raw.txt

:: 3. 从 live_raw.txt 中整理出纯 IP 列表 live_ips.txt
(
    for /f "tokens=2 delims= " %%a in (live_raw.txt) do (
        echo %%a
    )
) > live_ips.txt

:: 4. 生成整个网段的 IP 列表 all_ips.txt
echo [3] 生成整个网段 IP 列表 ...
(
    for /l %%i in (1,1,254) do (
        echo %BASE%.%%i
    )
) > all_ips.txt

:: 5. 做差集:从 all_ips 中去掉 live_ips,得到 unused_ips.txt
echo [4] 计算空闲 IP ...
findstr /v /x /g:live_ips.txt all_ips.txt > unused_ips.txt

echo.
echo 扫描完成:
echo   在线主机列表: live_ips.txt
echo   全部网段 IP:  all_ips.txt
echo   空闲 IP 列表: unused_ips.txt

 

posted @ 2026-03-02 15:26  dirgo  阅读(3)  评论(0)    收藏  举报