代码使用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