网站Logo 夕拾朝花

quickPing-利用fping快速探测网段存活主机

miubai
23
2025-07-11

使用DeepSeek生成的小工具,主要功能为快速探测网段中存活的主机,并将存活主机和探测到的主机IP分别存放到不同的文件夹内。

用法:

sudo ./quickPing.sh 192.168.1.0/24

脚本利用kali自带的fping工具实现,具体如下:

#!/bin/bash

# 设置颜色代码
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 记录脚本开始时间
START_TIME=$(date +%s)

# 帮助信息
show_help() {
    echo -e "${YELLOW}使用方法:${NC}"
    echo -e "  $0 [网络地址/掩码] [并发数] [超时(ms)]"
    echo -e "  $0 192.168.1.0/24"
    echo -e "  $0 10.0.0.0/16 100 200"
    echo -e "\n${YELLOW}默认值:${NC}"
    echo -e "  并发数: 50 (根据系统性能调整)"
    echo -e "  超时: 100ms (局域网建议100-500ms)"
    exit 1
}

# 检查参数
if [ $# -eq 0 ]; then
    show_help
fi

# 解析参数
NETWORK=$1
CONCURRENT=${2:-50}  # 默认并发数50
TIMEOUT=${3:-100}    # 默认超时100ms

# 验证输入格式
if ! [[ $NETWORK =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}/[0-9]{1,2}$ ]]; then
    echo -e "${RED}[!] 错误: 网络格式不正确,请使用类似 192.168.1.0/24 的格式${NC}"
    show_help
fi

# 验证并发数
if ! [[ $CONCURRENT =~ ^[0-9]+$ ]] || [ $CONCURRENT -lt 1 ] || [ $CONCURRENT -gt 500 ]; then
    echo -e "${RED}[!] 错误: 并发数必须是1-500之间的整数${NC}"
    show_help
fi

# 验证超时时间
if ! [[ $TIMEOUT =~ ^[0-9]+$ ]] || [ $TIMEOUT -lt 10 ] || [ $TIMEOUT -gt 5000 ]; then
    echo -e "${RED}[!] 错误: 超时时间必须是10-5000ms之间的整数${NC}"
    show_help
fi

# 提取网络前缀和掩码
NET_ADDR=$(echo $NETWORK | cut -d'/' -f1)
MASK=$(echo $NETWORK | cut -d'/' -f2)

# 验证掩码范围
if [ $MASK -lt 8 ] || [ $MASK -gt 30 ]; then
    echo -e "${RED}[!] 错误: 掩码必须在8-30之间${NC}"
    show_help
fi

# 根据掩码确定IP范围
if [ $MASK -eq 24 ]; then
    # /24网络
    NET_PREFIX=$(echo $NET_ADDR | cut -d'.' -f1-3)
    START_IP=1
    END_IP=254
elif [ $MASK -eq 16 ]; then
    # /16网络
    NET_PREFIX=$(echo $NET_ADDR | cut -d'.' -f1-2)
    START_IP=0.1
    END_IP=255.254
else
    echo -e "${RED}[!] 错误: 目前只支持/24和/16网络扫描${NC}"
    show_help
fi

# 创建结果目录结构
DATE_DIR=$(date +"%Y-%m-%d")
TIME_SUFFIX=$(date +"%H%M%S")
RESULT_DIR="result/$DATE_DIR"
mkdir -p "$RESULT_DIR"

# 输出文件
ALIVE_FILE="$RESULT_DIR/alive_ips_${TIME_SUFFIX}.txt"
DEAD_FILE="$RESULT_DIR/dead_ips_${TIME_SUFFIX}.txt"
IP_LIST="/tmp/ip_list_${DATE_DIR}_${TIME_SUFFIX}.tmp"

# 清空旧文件
> "$ALIVE_FILE"
> "$DEAD_FILE"
> "$IP_LIST"

# 生成IP列表
echo -e "${YELLOW}[+] 生成 $NETWORK 网段的IP列表...${NC}"
if [ $MASK -eq 24 ]; then
    seq $START_IP $END_IP | xargs -I {} echo "$NET_PREFIX.{}" > "$IP_LIST"
elif [ $MASK -eq 16 ]; then
    for third in $(seq 0 255); do
        seq 1 254 | xargs -I {} echo "$NET_PREFIX.$third.{}" >> "$IP_LIST"
    done
fi
TOTAL_IPS=$(wc -l < "$IP_LIST")

# 进度条函数
progress_bar() {
    local current=$1
    local total=$2
    local width=50
    local percent=$((current * 100 / total))
    local completed=$((current * width / total))
    
    printf "\r["
    for ((i=0; i<width; i++)); do
        if [ $i -lt $completed ]; then
            printf "#"
        else
            printf " "
        fi
    done
    printf "] %3d%%" $percent
}

# 并行扫描函数
parallel_scan() {
    local alive_file=$1
    local dead_file=$2
    local ip_list=$3
    local concurrent=$4
    local timeout=$5
    local total_ips=$6
    
    # 使用xargs并行处理
    echo -e "${YELLOW}[+] 开始并行扫描 (并发数: $concurrent, 超时: ${timeout}ms)...${NC}"
    
    cat "$ip_list" | xargs -P "$concurrent" -I {} bash -c "
        if fping -c1 -t$timeout {} &>/dev/null; then
            echo {} >> \"$alive_file\"
        else
            echo {} >> \"$dead_file\"
        fi
    "
}

# 开始扫描
echo -e "${YELLOW}[+] 总IP数: $TOTAL_IPS${NC}"
echo -e "${CYAN}[i] 结果目录: $RESULT_DIR/${NC}"
echo -e "${CYAN}[i] 存活IP文件: alive_ips_${TIME_SUFFIX}.txt${NC}"
echo -e "${CYAN}[i] 未存活IP文件: dead_ips_${TIME_SUFFIX}.txt${NC}"

# 后台运行进度条
while [ ! -f "$ALIVE_FILE" ] || [ $(wc -l < "$ALIVE_FILE" 2>/dev/null) -lt $TOTAL_IPS ]; do
    alive_count=$(wc -l < "$ALIVE_FILE" 2>/dev/null || echo 0)
    dead_count=$(wc -l < "$DEAD_FILE" 2>/dev/null || echo 0)
    processed=$((alive_count + dead_count))
    progress_bar $processed $TOTAL_IPS
    sleep 0.5
done &
PROGRESS_PID=$!

# 执行并行扫描
parallel_scan "$ALIVE_FILE" "$DEAD_FILE" "$IP_LIST" "$CONCURRENT" "$TIMEOUT" "$TOTAL_IPS"

# 等待进度条完成
kill $PROGRESS_PID 2>/dev/null
wait $PROGRESS_PID 2>/dev/null
printf "\n"

# 计算执行时间
END_TIME=$(date +%s)
ELAPSED_TIME=$((END_TIME - START_TIME))
FORMATTED_TIME=$(date -u -d @${ELAPSED_TIME} +"%H小时%M分%S秒")

# 统计结果
ALIVE_COUNT=$(wc -l < "$ALIVE_FILE")
DEAD_COUNT=$(wc -l < "$DEAD_FILE")

# 显示结果
echo -e "\n${GREEN}[+] 扫描完成!${NC}"
echo -e "${CYAN}[⏱] 执行时间: $FORMATTED_TIME${NC}"
echo -e "${GREEN}[√] 存活主机: $ALIVE_COUNT${NC}"
echo -e "${RED}[×] 未存活主机: $DEAD_COUNT${NC}"
echo -e "${YELLOW}[*] 存活IP列表: $ALIVE_FILE${NC}"
echo -e "${YELLOW}[*] 未存活IP列表: $DEAD_FILE${NC}"

# 清理临时文件
rm "$IP_LIST"

exit 0

动物装饰