Create 03

This commit is contained in:
2025-11-05 23:20:33 +08:00
committed by GitHub
parent f12ab11dc0
commit 0784256213

247
03 Normal file
View File

@@ -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