1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
| #!/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
|
v1.3.10