248 lines
7.1 KiB
Bash
248 lines
7.1 KiB
Bash
#!/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
|