#!/bin/bash
# 检查参数
if [ $# -ne 3 ]; then
echo "用法: $0 <网段前缀> <起始IP> <结束IP>"
echo "示例: $0 192.168.5 2 254"
exit 1
fi
prefix="$1"
start="$2"
end="$3"
max_thread=6
# 临时文件
success_file=$(mktemp)
failed_file=$(mktemp)
echo "正在扫描 $prefix.$start ~ $prefix.$end,并发 $max_thread 线程..."
echo "-------------------------------------------------------------"
# 单个IP检测函数
scan_ip() {
local ip="$1"
if ping -c 1 -W 1 "$ip" >/dev/null 2>&1; then
echo "$ip" >> "$success_file"
else
echo "$ip" >> "$failed_file"
fi
}
# 多线程控制
for ((i=start; i<=end; i++)); do
ip="$prefix.$i"
# 控制并发数
while [ $(jobs -p | wc -l) -ge "$max_thread" ]; do
sleep 0.1
done
scan_ip "$ip" &
done
# 等待所有后台任务结束
wait
# 按每行6列输出
print_list() {
local file="$1"
local color="$2"
local count=0
while read -r ip; do
printf "${color}%-16s\033[0m" "$ip"
((count++))
if [ $((count % 6)) -eq 0 ]; then
echo
fi
done < "$file"
# 补换行
[ $((count % 6)) -ne 0 ] && echo
}
echo -e "\n【可 Ping 通】"
print_list "$success_file" "\033