Create 03
This commit is contained in:
247
03
Normal file
247
03
Normal 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
|
||||
Reference in New Issue
Block a user