列出网络上所有活动的主机

网络活动主机扫描脚本:快速检测局域网内在线设备

#!/bin/bash

# 配置参数
NETWORK="192.168.0"  # 网络前缀
START=1              # 起始IP
END=255              # 结束IP
TIMEOUT=1            # ping超时时间(秒)
COUNT=1              # ping包数量
THREADS=50           # 并发线程数
OUTPUT_FILE="alive_hosts.txt"  # 结果保存文件

# 显示脚本使用帮助
usage() {
    echo "用法: $0 [选项]"
    echo "选项:"
    echo "  -n <网络前缀>   设置网络前缀(默认: 192.168.0)"
    echo "  -s <起始IP>     设置起始IP(默认: 1)"
    echo "  -e <结束IP>     设置结束IP(默认: 255)"
    echo "  -t <超时时间>   设置ping超时时间(秒)(默认: 1)"
    echo "  -c <包数量>     设置ping包数量(默认: 1)"
    echo "  -T <线程数>     设置并发线程数(默认: 50)"
    echo "  -o <文件>       设置结果输出文件(默认: alive_hosts.txt)"
    echo "  -h              显示帮助信息"
    exit 1
}

# 解析命令行参数
while getopts "n:s:e:t:c:T:o:h" opt; do
    case $opt in
        n) NETWORK="$OPTARG" ;;
        s) START="$OPTARG" ;;
        e) END="$OPTARG" ;;
        t) TIMEOUT="$OPTARG" ;;
        c) COUNT="$OPTARG" ;;
        T) THREADS="$OPTARG" ;;
        o) OUTPUT_FILE="$OPTARG" ;;
        h) usage ;;
        *) usage ;;
    esac
done

# 检查参数有效性
if [ $START -gt $END ]; then
    echo "错误: 起始IP不能大于结束IP"
    exit 1
fi

if [ $THREADS -lt 1 ] || [ $THREADS -gt 255 ]; then
    echo "错误: 线程数必须在1-255之间"
    exit 1
fi

# 初始化结果文件
> $OUTPUT_FILE

# 扫描函数
scan_host() {
    local ip="$NETWORK.$1"
    # 执行ping命令,静默模式
    if ping -c $COUNT -W $TIMEOUT $ip &> /dev/null; then
        # 获取主机名(如果能解析)
        local hostname=$(nslookup $ip 2>/dev/null | grep 'name =' | awk '{print $4}' | sed 's/\.$//')
        if [ -n "$hostname" ]; then
            echo "$ip  is alive (主机名: $hostname)"
            echo "$ip $hostname" >> $OUTPUT_FILE
        else
            echo "$ip  is alive"
            echo "$ip" >> $OUTPUT_FILE
        fi
    fi
}

# 显示扫描信息
echo "开始扫描网络 $NETWORK.$START-$NETWORK.$END ..."
echo "并发线程数: $THREADS, 超时时间: $TIMEOUT秒"
echo "结果将保存至: $OUTPUT_FILE"
echo "----------------------------------------"

# 多线程扫描
for ((i=START; i<=END; i++)); do
    scan_host $i &
    # 控制并发线程数
    while [ $(jobs -r | wc -l) -ge $THREADS ]; do
        sleep 0.1
    done
done

# 等待所有线程完成
wait

# 显示扫描结果汇总
echo "----------------------------------------"
echo "扫描完成! 共发现 $(wc -l < $OUTPUT_FILE) 台活动主机:"
cat $OUTPUT_FILE

使用示例:

# 扫描192.168.1.1-100,使用30线程
./scan_alive_hosts.sh -n 192.168.1 -s 1 -e 100 -T 30

# 快速扫描(1个包,0.5秒超时)
./scan_alive_hosts.sh -c 1 -t 0.5