Files
dock/03
2025-11-05 23:20:33 +08:00

248 lines
7.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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