ping_test_parallel.sh 并行网络扫描脚本

并行网络扫描脚本分析:提高网络探测效率

引言

在网络管理和运维过程中,快速检测网段内主机的在线状态是一项常见需求。传统的顺序扫描方法在面对大型网段时效率低下,而并行处理则可以显著提升扫描速度。本文将分析一个基于Bash的并行网络扫描脚本,探讨其实现原理、优势以及可能的改进方向。

脚本概述

这个名为ping_test_parallel.sh的脚本使用并行处理技术,通过ping命令同时检测多个IP地址的可达性,并以彩色输出展示结果。脚本主要特点包括:

  • 并行执行ping测试,大幅提高扫描效率
  • 控制最大并行进程数,避免系统资源过度消耗
  • 使用彩色输出直观展示在线/离线状态
  • 提供扫描结果统计信息

核心代码分析

颜色定义与初始化

bash 复制代码
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 临时文件用于存储结果
TEMP_FILE="/tmp/ping_results_$$"
ipaddr="10.0.20"

脚本使用ANSI转义序列定义了绿色和红色,分别用于标识在线和离线状态。$$变量代表当前脚本的进程ID,确保临时文件名的唯一性,避免多个实例之间的冲突。

并行处理机制

bash 复制代码
# 最大并行进程数
MAX_PROC=20
current_proc=0

# 测试函数
test_ip() {
    local ip=$1
    if ping -c 2 -W 1 $ip >/dev/null 2>&1; then
        echo "$ip 1" >> "$TEMP_FILE"
    else
        echo "$ip 0" >> "$TEMP_FILE"
    fi
}

脚本限制了最大并行进程数为20,这是一个平衡扫描速度和系统负载的关键参数。test_ip函数封装了ping测试逻辑,对每个IP执行2次ping,超时时间为1秒,并将结果写入临时文件。

并行执行与进程控制

bash 复制代码
# 并行测试所有IP
for i in {1..254}; do
    ip="$ipaddr.$i"
    
    # 后台运行ping测试
    test_ip $ip &
    
    # 控制并行进程数
    current_proc=$((current_proc + 1))
    if [ $current_proc -ge $MAX_PROC ]; then
        wait
        current_proc=0
    fi
done

# 等待所有进程完成
wait

这段代码是脚本的核心,它遍历C类网段的254个可能IP地址,并在后台启动ping测试。通过wait命令和计数器机制,脚本确保并行进程数不超过预设的最大值,既提高了效率,又避免了系统资源耗尽。

结果处理与统计

bash 复制代码
# 统计结果
declare -i total=0
declare -i online=0
declare -i offline=0

# 读取并显示结果
while read ip status; do
    if [ "$status" = "1" ]; then
        echo -e "${GREEN}[在线]${NC} $ip"
        ((online++))
    else
        echo -e "${RED}[离线]${NC} $ip"
        ((offline++))
    fi
    ((total++))
done < <(sort -V "$TEMP_FILE")

脚本使用sort -V命令按版本号排序方式处理IP地址,确保输出的IP地址顺序符合人类直觉。通过进程替换<(...)将排序后的结果传递给while循环,实现了高效的结果处理。

技术亮点

  1. 并行处理 :脚本通过后台执行(&)实现了并行处理,显著提高了扫描效率。
  2. 资源控制:通过限制最大并行进程数,避免系统资源过度消耗。
  3. 进程同步 :使用wait命令确保所有子进程完成后再继续执行。
  4. 临时文件管理:使用进程ID创建唯一临时文件,并在脚本结束时清理。
  5. 彩色输出:利用ANSI转义序列实现彩色输出,提升用户体验。

性能分析

与传统的顺序扫描相比,该脚本的并行处理机制可以显著提高扫描速度。在一个包含254个IP地址的C类网段中:

  • 顺序扫描:如果每个IP平均需要2秒(考虑超时),总共需要约508秒(8.5分钟)
  • 并行扫描:使用20个并行进程,理论上只需要约26秒(508/20,实际略多)

这种效率提升在大型网络环境中尤为明显,是网络管理员的得力助手。

结论

这个并行网络扫描脚本展示了如何利用Bash的并行处理能力来提高网络管理效率。通过合理控制并行度和资源使用,它在保证系统稳定的同时,大幅提升了扫描速度。对于网络管理员和系统运维人员来说,这是一个简单而实用的工具,可以帮助快速了解网络状态,及时发现潜在问题。

附录:完整脚本

bash 复制代码
#!/bin/bash

# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# 临时文件用于存储结果
TEMP_FILE="/tmp/ping_results_$$"
ipaddr="10.0.20"
echo "开始并行测试 $ipaddr.0/24 网段..."

# 最大并行进程数
MAX_PROC=20
current_proc=0

# 测试函数
test_ip() {
    local ip=$1
    if ping -c 2 -W 1 $ip >/dev/null 2>&1; then
        echo "$ip 1" >> "$TEMP_FILE"
    else
        echo "$ip 0" >> "$TEMP_FILE"
    fi
}

# 创建临时文件
> "$TEMP_FILE"

# 并行测试所有IP
for i in {1..254}; do
    ip="$ipaddr.$i"
    
    # 后台运行ping测试
    test_ip $ip &
    
    # 控制并行进程数
    current_proc=$((current_proc + 1))
    if [ $current_proc -ge $MAX_PROC ]; then
        wait
        current_proc=0
    fi
done

# 等待所有进程完成
wait

# 统计结果
declare -i total=0
declare -i online=0
declare -i offline=0

# 读取并显示结果
while read ip status; do
    if [ "$status" = "1" ]; then
        echo -e "${GREEN}[在线]${NC} $ip"
        ((online++))
    else
        echo -e "${RED}[离线]${NC} $ip"
        ((offline++))
    fi
    ((total++))
done < <(sort -V "$TEMP_FILE")

# 输出统计信息
echo -e "\n=== 测试完成 ==="
echo "总计: $total"
echo -e "${GREEN}在线: $online${NC}"
echo -e "${RED}离线: $offline${NC}"

# 清理临时文件
rm -f "$TEMP_FILE"
相关推荐
HLC++9 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室10 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
groundhappy13 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕14 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫15 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生15 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1116 小时前
linux基础IO
linux·运维·服务器
BelongPanda18 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯18 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983419 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器