diff --git a/03 b/03 new file mode 100644 index 0000000..49d9c58 --- /dev/null +++ b/03 @@ -0,0 +1,247 @@ +#!/bin/bash + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +PURPLE='\033[0;35m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# 显示标题 +echo -e "${CYAN}" +echo "================================================" +echo " 网络连接诊断工具 v2.0" +echo "================================================" +echo -e "${NC}" + +# 函数:显示帮助信息 +show_help() { + echo -e "${YELLOW}使用说明:${NC}" + echo "1. 本工具用于测试网络连接和端口状态" + echo "2. 支持IP地址和域名测试" + echo "3. 可以测试多个端口" + echo "4. 包含详细的连接状态分析" + echo "" +} + +# 函数:输入IP/域名 +input_target() { + while true; do + echo -e "${BLUE}请输入要测试的目标IP地址或域名:${NC}" + read -p "目标地址: " TARGET + + if [ -z "$TARGET" ]; then + echo -e "${RED}错误:目标地址不能为空!${NC}" + continue + fi + + # 简单验证格式 + if [[ "$TARGET" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]] || [[ "$TARGET" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then + break + else + echo -e "${RED}错误:请输入有效的IP地址或域名!${NC}" + fi + done +} + +# 函数:输入端口 +input_ports() { + echo -e "${BLUE}请输入要测试的端口(多个端口用空格分隔):${NC}" + read -p "端口: " PORTS_INPUT + + if [ -z "$PORTS_INPUT" ]; then + echo -e "${YELLOW}警告:未输入端口,使用默认端口 25555${NC}" + PORTS=("25555") + else + # 将输入的端口转换为数组 + PORTS=($PORTS_INPUT) + fi +} + +# 函数:Ping测试 +ping_test() { + echo -e "\n${PURPLE}=== Ping 连通性测试 ===${NC}" + echo -e "目标: ${YELLOW}$TARGET${NC}" + + if ping -c 4 -W 2 "$TARGET" &> /dev/null; then + echo -e "${GREEN}✓ Ping 测试成功 - 网络连通正常${NC}" + PING_RESULT=$(ping -c 4 -W 2 "$TARGET" | grep -E "packets transmitted|min/avg/max") + echo "$PING_RESULT" + else + echo -e "${RED}✗ Ping 测试失败 - 网络不通${NC}" + return 1 + fi +} + +# 函数:端口扫描测试 +port_scan_test() { + local port=$1 + echo -e "\n${PURPLE}=== 端口 $port 测试 ===${NC}" + + # 测试1: nc 命令 + echo -e "${CYAN}[测试1] NC 端口扫描...${NC}" + if command -v nc &> /dev/null; then + if nc -zv -w 3 "$TARGET" "$port" &> /dev/null; then + echo -e "${GREEN}✓ NC 测试 - 端口 $port 开放${NC}" + else + echo -e "${RED}✗ NC 测试 - 端口 $port 关闭或无法连接${NC}" + fi + else + echo -e "${YELLOW}⚠ NC 命令未安装,跳过此测试${NC}" + fi + + # 测试2: TCP 连接测试 + echo -e "${CYAN}[测试2] TCP 连接测试...${NC}" + if timeout 3 bash -c "echo > /dev/tcp/$TARGET/$port" 2>/dev/null; then + echo -e "${GREEN}✓ TCP 测试 - 端口 $port 可连接${NC}" + else + echo -e "${RED}✗ TCP 测试 - 端口 $port 无法连接${NC}" + fi + + # 测试3: telnet 测试(如果可用) + echo -e "${CYAN}[测试3] Telnet 测试...${NC}" + if command -v telnet &> /dev/null; then + if timeout 3 telnet "$TARGET" "$port" 2>&1 | grep -q "Connected"; then + echo -e "${GREEN}✓ Telnet 测试 - 端口 $port 可连接${NC}" + else + echo -e "${RED}✗ Telnet 测试 - 端口 $port 无法连接${NC}" + fi + else + echo -e "${YELLOW}⚠ Telnet 命令未安装,跳过此测试${NC}" + fi +} + +# 函数:DNS解析测试 +dns_test() { + echo -e "\n${PURPLE}=== DNS 解析测试 ===${NC}" + if [[ "$TARGET" =~ ^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then + echo -e "${CYAN}检测到域名,进行DNS解析...${NC}" + if nslookup "$TARGET" &> /dev/null; then + echo -e "${GREEN}✓ DNS 解析成功${NC}" + nslookup "$TARGET" | grep -A 10 "Name:" + else + echo -e "${RED}✗ DNS 解析失败${NC}" + fi + else + echo -e "${CYAN}检测到IP地址,跳过DNS解析测试${NC}" + fi +} + +# 函数:路由跟踪 +trace_route() { + echo -e "\n${PURPLE}=== 路由跟踪测试 ===${NC}" + echo -e "${YELLOW}是否进行路由跟踪?(y/n, 可能需要较长时间)${NC}" + read -p "选择: " DO_TRACE + + if [[ "$DO_TRACE" == "y" || "$DO_TRACE" == "Y" ]]; then + if command -v traceroute &> /dev/null; then + echo -e "${CYAN}开始路由跟踪...${NC}" + traceroute -m 15 "$TARGET" + elif command -v tracepath &> /dev/null; then + echo -e "${CYAN}开始路由跟踪 (使用 tracepath)...${NC}" + tracepath "$TARGET" + else + echo -e "${YELLOW}⚠ 路由跟踪命令未安装${NC}" + fi + fi +} + +# 函数:生成测试报告 +generate_report() { + echo -e "\n${PURPLE}=== 测试报告 ===${NC}" + echo -e "测试时间: $(date)" + echo -e "目标地址: ${YELLOW}$TARGET${NC}" + echo -e "测试端口: ${YELLOW}${PORTS[*]}${NC}" + + # 汇总结果 + echo -e "\n${CYAN}汇总结果:${NC}" + if ping -c 1 -W 2 "$TARGET" &> /dev/null; then + echo -e "${GREEN}● 网络连通性: 正常${NC}" + else + echo -e "${RED}● 网络连通性: 异常${NC}" + fi + + echo -e "● 端口状态:" + for port in "${PORTS[@]}"; do + if timeout 2 bash -c "echo > /dev/tcp/$TARGET/$port" 2>/dev/null; then + echo -e " 端口 $port: ${GREEN}开放${NC}" + else + echo -e " 端口 $port: ${RED}关闭${NC}" + fi + done +} + +# 主函数 +main() { + # 显示帮助信息 + show_help + + # 获取用户输入 + input_target + input_ports + + echo -e "\n${GREEN}开始网络诊断测试...${NC}" + echo -e "目标: ${YELLOW}$TARGET${NC}" + echo -e "端口: ${YELLOW}${PORTS[*]}${NC}" + echo "" + + # 执行各项测试 + dns_test + ping_test + ping_result=$? + + # 如果ping不通,询问是否继续 + if [ $ping_result -ne 0 ]; then + echo -e "\n${YELLOW}警告: Ping 测试失败,目标可能无法访问${NC}" + echo -e "${YELLOW}是否继续端口测试?(y/n)${NC}" + read -p "选择: " CONTINUE + if [[ "$CONTINUE" != "y" && "$CONTINUE" != "Y" ]]; then + echo -e "${RED}测试终止${NC}" + exit 1 + fi + fi + + # 端口测试 + for port in "${PORTS[@]}"; do + port_scan_test "$port" + done + + # 路由跟踪 + trace_route + + # 生成报告 + generate_report + + echo -e "\n${GREEN}网络诊断完成!${NC}" +} + +# 检查必要命令 +check_requirements() { + local missing=() + + for cmd in ping nc timeout; do + if ! command -v "$cmd" &> /dev/null; then + missing+=("$cmd") + fi + done + + if [ ${#missing[@]} -gt 0 ]; then + echo -e "${RED}错误: 缺少必要的命令: ${missing[*]}${NC}" + echo -e "${YELLOW}请安装缺少的命令后重新运行脚本${NC}" + exit 1 + fi +} + +# 脚本入口 +if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then + show_help + exit 0 +fi + +# 检查系统要求 +check_requirements + +# 运行主程序 +main