网站Logo 夕拾朝花

ip_scan.sh 从目标文件中找出存活主机

miubai
37
2025-07-13

代码使用deepseek生成,功能:从target.txt文件中读取目标IP,并将存活的主机存放到result文件中。

target.txt文件支持的三种格式

1.单ip格式,如:192.168.1.1

2.区间格式,如:192.168.1.1-20

3.网断格式,如:192.168.1.1/24

脚本如下:

#!/bin/bash

# ==============================================
# 终极稳定版IP扫描脚本 (v4.0 完整修复版)
# 修复问题:
# 1. 修复process_results未定义错误
# 2. 确保完整扫描所有IP
# ==============================================

# 配置参数
MAX_THREADS=50
PING_TIMEOUT=1000
RETRIES=3
SCAN_LIST="target.txt"
DEBUG=false

# 结果目录
OUTPUT_DIR="result"
ALIVE_IPS="$OUTPUT_DIR/alive_ips.txt"
UNREACHABLE_IPS="$OUTPUT_DIR/unreachable_ips.txt"
SCAN_LOG="$OUTPUT_DIR/scan.log"

# 颜色定义
GREEN='\033[1;32m'
RED='\033[1;31m'
BLUE='\033[1;34m'
YELLOW='\033[1;33m'
NC='\033[0m'

# 初始化
init() {
    if ! command -v fping &> /dev/null; then
        echo -e "${RED}[!] 错误: fping未安装,请先执行 'sudo apt install fping'${NC}"
        exit 1
    fi

    mkdir -p "$OUTPUT_DIR"
    > "$ALIVE_IPS"
    > "$UNREACHABLE_IPS"
    > "$SCAN_LOG"
    
    start_time=$(date +%s)
    echo -e "${BLUE}[+] 初始化完成,开始扫描...${NC}"
    echo "扫描开始时间: $(date '+%F %T')" >> "$SCAN_LOG"
}

# 进度条显示
show_progress() {
    local current=$1
    local total=$2
    local width=50
    local percent=$((current*100/total))
    local progress=$((current*width/total))
    
    printf "\r["
    printf "%${progress}s" | tr ' ' '#'
    printf "%$((width-progress))s" ""
    printf "] %3d%% (%d/%d)" $percent $current $total
}

# IP范围展开
expand_target() {
    local target=$1
    if [[ "$target" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
        echo "$target"
    elif [[ "$target" =~ ^([0-9]+\.[0-9]+\.[0-9]+\.)([0-9]+)-([0-9]+)$ ]]; then
        local prefix=${BASH_REMATCH[1]}
        local start=${BASH_REMATCH[2]}
        local end=${BASH_REMATCH[3]}
        
        for i in $(seq $start $end); do
            echo "${prefix}${i}"
        done
    elif [[ "$target" =~ ^([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+/([0-9]+)$ ]]; then
        local base=${BASH_REMATCH[1]}
        local mask=${BASH_REMATCH[2]}
        
        if [[ "$mask" -eq 24 ]]; then
            for i in {0..255}; do
                echo "${base}.${i}"
            done
        else
            fping -g -q "$target" 2>&1 | grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' || true
        fi
    fi
}

# 扫描IP
scan_ip() {
    local ip=$1
    for ((i=0; i<=RETRIES; i++)); do
        if fping -t "$PING_TIMEOUT" -r0 "$ip" &>/dev/null; then
            echo "$ip" >> "$ALIVE_IPS"
            return 0
        fi
        sleep 0.$((RANDOM%3+1))
    done
    echo "$ip" >> "$UNREACHABLE_IPS"
}

# 主扫描流程
main_scan() {
    local total_ips=0
    local processed=0
    
    local all_ips_file=$(mktemp)
    
    while read -r target; do
        [[ -z "$target" || "$target" =~ ^# ]] && continue
        expand_target "$target" >> "$all_ips_file"
    done < "$SCAN_LIST"
    
    total_ips=$(wc -l < "$all_ips_file" 2>/dev/null || echo 0)
    
    if [[ $total_ips -eq 0 ]]; then
        echo -e "${RED}[!] 错误: 未找到有效的IP地址${NC}"
        rm -f "$all_ips_file"
        exit 1
    fi
    
    echo -e "${YELLOW}[*] 需要扫描 $total_ips 个IP地址${NC}"
    
    while read -r ip; do
        ((processed++))
        if (( processed % 10 == 0 || processed == total_ips )); then
            show_progress "$processed" "$total_ips"
        fi
        
        scan_ip "$ip" &
        
        while (( $(jobs -rp | wc -l) >= MAX_THREADS )); do
            sleep 0.1
        done
    done < "$all_ips_file"
    
    wait
    show_progress "$total_ips" "$total_ips"
    echo
    
    rm -f "$all_ips_file"
}

# 结果统计
process_results() {
    sort -u "$ALIVE_IPS" -o "$ALIVE_IPS"
    sort -u "$UNREACHABLE_IPS" -o "$UNREACHABLE_IPS"
    
    local alive_count=$(wc -l < "$ALIVE_IPS" 2>/dev/null || echo 0)
    local dead_count=$(wc -l < "$UNREACHABLE_IPS" 2>/dev/null || echo 0)
    end_time=$(date +%s)
    duration=$((end_time - start_time))
    
    echo -e "\n${BLUE}====== 扫描结果 ======${NC}"
    echo -e "扫描耗时:   ${duration}秒"
    echo -e "扫描IP总数: $((alive_count + dead_count))"
    echo -e "活跃主机:   ${GREEN}$alive_count 个${NC}"
    echo -e "不可达主机: ${RED}$dead_count 个${NC}"
    echo -e "扫描效率:   $(( (alive_count + dead_count) / (duration>0?duration:1) )) IP/秒"
    
    {
        echo "活跃主机列表:"
        [[ -s "$ALIVE_IPS" ]] && cat "$ALIVE_IPS" || echo "无"
        echo -e "\n不可达主机列表:"
        [[ -s "$UNREACHABLE_IPS" ]] && cat "$UNREACHABLE_IPS" || echo "无"
    } >> "$SCAN_LOG"
}

# 主流程
init
main_scan
process_results  # 确保这行存在且拼写正确

if [[ ! -s "$ALIVE_IPS" && ! -s "$UNREACHABLE_IPS" ]]; then
    echo -e "\n${RED}[!] 警告: 未检测到任何主机,请检查:${NC}"
    echo "1. 目标IP是否正确"
    echo "2. 网络连接是否正常"
    echo "3. 是否有防火墙阻止ICMP请求"
    echo "4. 尝试手动执行: fping 192.168.40.1"
fi

动物装饰