This commit is contained in:
sindricn
2025-08-05 15:35:24 +08:00
parent 4411405a70
commit 915e00cfc7
4 changed files with 282 additions and 32 deletions
+5 -2
View File
@@ -25,11 +25,14 @@ sudo s-hy2
### 安装问题修复
如果安装后遇到问题(如"安装脚本不存在"),可以运行修复脚本:
如果安装后遇到问题,可以运行对应的修复脚本:
```bash
# 修复安装的 s-hy2
# 修复安装问题(如"安装脚本不存在")
curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/fix-installation.sh | sudo bash
# 修复域名测试问题(如显示调试信息而非域名)
curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/fix-domain-test.sh | sudo bash
```
### 其他安装方式
+107
View File
@@ -0,0 +1,107 @@
#!/bin/bash
# 修复域名测试功能脚本
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
INSTALL_DIR="/opt/s-hy2"
RAW_URL="https://raw.githubusercontent.com/sindricn/s-hy2/main"
echo -e "${CYAN}修复域名测试功能${NC}"
echo ""
# 检查权限
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}错误: 需要 root 权限${NC}"
echo "请使用: sudo bash"
exit 1
fi
# 检查安装目录
if [[ ! -d "$INSTALL_DIR" ]]; then
echo -e "${RED}错误: S-Hy2 未安装${NC}"
echo "请先运行安装脚本"
exit 1
fi
echo -e "${BLUE}正在修复域名测试功能...${NC}"
# 备份原文件
if [[ -f "$INSTALL_DIR/scripts/domain-test.sh" ]]; then
cp "$INSTALL_DIR/scripts/domain-test.sh" "$INSTALL_DIR/scripts/domain-test.sh.backup.$(date +%Y%m%d_%H%M%S)"
echo -e "${GREEN}✓ 已备份原文件${NC}"
fi
# 下载修复后的域名测试脚本
echo -e "${BLUE}下载修复后的域名测试脚本...${NC}"
if curl -fsSL "$RAW_URL/scripts/domain-test.sh" -o "$INSTALL_DIR/scripts/domain-test.sh"; then
chmod +x "$INSTALL_DIR/scripts/domain-test.sh"
echo -e "${GREEN}✓ 域名测试脚本更新成功${NC}"
else
echo -e "${RED}✗ 域名测试脚本下载失败${NC}"
exit 1
fi
# 同时更新主脚本,确保路径问题也被修复
echo -e "${BLUE}更新主脚本...${NC}"
if curl -fsSL "$RAW_URL/hy2-manager.sh" -o "$INSTALL_DIR/hy2-manager.sh"; then
chmod +x "$INSTALL_DIR/hy2-manager.sh"
echo -e "${GREEN}✓ 主脚本更新成功${NC}"
else
echo -e "${YELLOW}⚠ 主脚本更新失败,但域名测试功能已修复${NC}"
fi
# 验证修复效果
echo -e "${BLUE}验证修复效果...${NC}"
# 加载修复后的脚本
source "$INSTALL_DIR/scripts/domain-test.sh"
# 测试静默版本
echo "测试静默版本域名测试..."
if results=$(test_all_domains_silent 2>/dev/null | head -3); then
if [[ -n "$results" ]]; then
echo -e "${GREEN}✓ 静默版本测试成功${NC}"
# 验证输出格式
valid=true
while IFS= read -r line; do
if [[ -n "$line" ]]; then
latency=$(echo "$line" | awk '{print $1}')
domain=$(echo "$line" | awk '{print $2}')
if [[ ! "$latency" =~ ^[0-9]+$ ]] || [[ -z "$domain" ]] || [[ "$domain" =~ [[:space:]] ]]; then
valid=false
break
fi
fi
done <<< "$results"
if [[ "$valid" == "true" ]]; then
echo -e "${GREEN}✓ 输出格式验证通过${NC}"
else
echo -e "${YELLOW}⚠ 输出格式可能仍有问题${NC}"
fi
else
echo -e "${YELLOW}⚠ 静默版本无输出,可能是网络问题${NC}"
fi
else
echo -e "${RED}✗ 静默版本测试失败${NC}"
fi
echo ""
echo -e "${CYAN}修复完成!${NC}"
echo ""
echo -e "${YELLOW}现在可以测试域名功能:${NC}"
echo "1. 运行: sudo s-hy2"
echo "2. 选择 '6. 测试伪装域名'"
echo "3. 选择 '2. 交互式选择域名'"
echo ""
echo -e "${YELLOW}如果仍有问题,可以运行验证脚本:${NC}"
echo "curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/test-domain-fix.sh | bash"
+62 -30
View File
@@ -57,33 +57,51 @@ test_domain_latency() {
fi
}
# 测试所有域名并排序
test_all_domains() {
# 测试所有域名并排序 (静默版本,只输出结果)
test_all_domains_silent() {
local results=()
local total=${#DOMAINS[@]}
local current=0
echo -e "${BLUE}正在测试 $total 个域名的延迟...${NC}"
echo ""
for domain in "${DOMAINS[@]}"; do
current=$((current + 1))
printf "\r${BLUE}进度: $current/$total - 测试 $domain${NC}"
if result=$(test_domain_latency "$domain" 3); then
results+=("$result")
fi
done
echo ""
echo ""
if [[ ${#results[@]} -eq 0 ]]; then
echo -e "${RED}所有域名测试失败,请检查网络连接${NC}"
return 1
fi
# 排序结果
# 排序结果并输出
printf '%s\n' "${results[@]}" | sort -n
}
# 测试所有域名并排序 (带进度显示)
test_all_domains() {
local results=()
local total=${#DOMAINS[@]}
local current=0
echo -e "${BLUE}正在测试 $total 个域名的延迟...${NC}" >&2
echo "" >&2
for domain in "${DOMAINS[@]}"; do
current=$((current + 1))
printf "\r${BLUE}进度: $current/$total - 测试 $domain${NC}" >&2
if result=$(test_domain_latency "$domain" 3); then
results+=("$result")
fi
done
echo "" >&2
echo "" >&2
if [[ ${#results[@]} -eq 0 ]]; then
echo -e "${RED}所有域名测试失败,请检查网络连接${NC}" >&2
return 1
fi
# 排序结果并输出
printf '%s\n' "${results[@]}" | sort -n
}
@@ -114,7 +132,7 @@ get_best_domain() {
# 获取最优域名名称
get_best_domain_name() {
local best_result=$(test_all_domains | head -n 1)
local best_result=$(test_all_domains_silent | head -n 1)
if [[ -n "$best_result" ]]; then
echo "$best_result" | awk '{print $2}'
else
@@ -126,29 +144,43 @@ get_best_domain_name() {
interactive_domain_selection() {
echo -e "${BLUE}域名延迟测试和选择${NC}"
echo ""
# 显示测试结果
local results=$(test_all_domains | head -n 10)
# 显示进度信息
echo -e "${BLUE}正在测试域名延迟,请稍候...${NC}"
# 使用静默版本获取测试结果,避免进度信息混入
local results=$(test_all_domains_silent | head -n 10)
if [[ -z "$results" ]]; then
echo -e "${RED}域名测试失败,使用默认域名${NC}"
echo "默认域名: news.ycombinator.com"
read -p "按回车键继续..."
return
fi
echo ""
echo -e "${CYAN}可用域名列表:${NC}"
echo ""
printf "%-5s %-30s %s\n" "编号" "域名" "延迟(ms)"
echo "----------------------------------------"
local domains_array=()
local index=1
while read -r latency domain; do
printf "%-5d %-30s %d ms\n" "$index" "$domain" "$latency"
domains_array+=("$domain")
index=$((index + 1))
# 改进解析逻辑,过滤无效行
while IFS= read -r line; do
if [[ -n "$line" ]]; then
# 提取延迟和域名
local latency=$(echo "$line" | awk '{print $1}')
local domain=$(echo "$line" | awk '{print $2}')
# 验证数据格式:延迟必须是数字,域名不能为空且不能包含空格
if [[ "$latency" =~ ^[0-9]+$ ]] && [[ -n "$domain" ]] && [[ ! "$domain" =~ [[:space:]] ]]; then
printf "%-5d %-30s %d ms\n" "$index" "$domain" "$latency"
domains_array+=("$domain")
index=$((index + 1))
fi
fi
done <<< "$results"
echo ""
+108
View File
@@ -0,0 +1,108 @@
#!/bin/bash
# 测试域名功能修复效果
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
echo -e "${CYAN}域名测试功能修复验证${NC}"
echo ""
# 检查脚本是否存在
if [[ ! -f "/opt/s-hy2/scripts/domain-test.sh" ]]; then
echo -e "${RED}错误: 域名测试脚本不存在${NC}"
echo "请先运行修复脚本:"
echo "curl -fsSL https://raw.githubusercontent.com/sindricn/s-hy2/main/fix-installation.sh | sudo bash"
exit 1
fi
# 加载域名测试脚本
source /opt/s-hy2/scripts/domain-test.sh
echo -e "${BLUE}测试1: 静默版本域名测试${NC}"
echo "这个测试应该只输出 '延迟 域名' 格式的数据,没有进度信息"
echo ""
# 测试静默版本
echo "--- 静默版本输出 ---"
results=$(test_all_domains_silent | head -5)
echo "$results"
echo "--- 输出结束 ---"
echo ""
# 验证输出格式
echo -e "${BLUE}验证输出格式:${NC}"
valid_lines=0
total_lines=0
while IFS= read -r line; do
if [[ -n "$line" ]]; then
total_lines=$((total_lines + 1))
latency=$(echo "$line" | awk '{print $1}')
domain=$(echo "$line" | awk '{print $2}')
if [[ "$latency" =~ ^[0-9]+$ ]] && [[ -n "$domain" ]] && [[ ! "$domain" =~ [[:space:]] ]]; then
echo -e "${GREEN}✓ 有效: $latency ms - $domain${NC}"
valid_lines=$((valid_lines + 1))
else
echo -e "${RED}✗ 无效: $line${NC}"
fi
fi
done <<< "$results"
echo ""
echo "统计: $valid_lines/$total_lines 行有效"
if [[ $valid_lines -eq $total_lines ]] && [[ $total_lines -gt 0 ]]; then
echo -e "${GREEN}✅ 静默版本测试通过${NC}"
else
echo -e "${RED}❌ 静默版本测试失败${NC}"
fi
echo ""
echo -e "${BLUE}测试2: 带进度版本域名测试${NC}"
echo "这个测试应该显示进度信息,但不影响结果输出"
echo ""
# 测试带进度版本
echo "--- 带进度版本输出 ---"
results_with_progress=$(test_all_domains | head -5)
echo "$results_with_progress"
echo "--- 输出结束 ---"
echo ""
# 比较两个版本的输出
echo -e "${BLUE}比较两个版本的输出:${NC}"
if [[ "$results" == "$results_with_progress" ]]; then
echo -e "${GREEN}✅ 两个版本输出一致${NC}"
else
echo -e "${RED}❌ 两个版本输出不一致${NC}"
echo ""
echo "静默版本:"
echo "$results"
echo ""
echo "带进度版本:"
echo "$results_with_progress"
fi
echo ""
echo -e "${BLUE}测试3: 获取最优域名${NC}"
best_domain=$(get_best_domain_name)
echo "最优域名: $best_domain"
if [[ -n "$best_domain" ]] && [[ ! "$best_domain" =~ [[:space:]] ]]; then
echo -e "${GREEN}✅ 最优域名获取成功${NC}"
else
echo -e "${RED}❌ 最优域名获取失败${NC}"
fi
echo ""
echo -e "${CYAN}修复验证完成${NC}"
echo ""
echo -e "${YELLOW}如果所有测试都通过,域名测试功能应该已经修复${NC}"
echo -e "${YELLOW}现在可以运行 'sudo s-hy2' 测试交互式域名选择功能${NC}"