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