diff --git a/scripts/outbound-manager.sh b/scripts/outbound-manager.sh index 628007e..60290a6 100644 --- a/scripts/outbound-manager.sh +++ b/scripts/outbound-manager.sh @@ -27,7 +27,141 @@ fi init_outbound_manager() { log_info "初始化出站规则管理器" - # 模板功能已移除 + # 检查必要的命令 + require_command "awk" + require_command "grep" + require_command "sed" + + # 检查 Hysteria2 安装状态 + check_hysteria2_installation +} + +# 检查 Hysteria2 安装和配置状态 +check_hysteria2_installation() { + local has_binary=false + local has_config_dir=false + + # 检查二进制文件 + if command -v hysteria >/dev/null 2>&1; then + has_binary=true + fi + + # 检查配置目录 + if [[ -d "/etc/hysteria" ]]; then + has_config_dir=true + fi + + # 根据检查结果提供指导 + if ! $has_binary; then + echo "" + echo -e "${RED}❌ Hysteria2 未安装${NC}" + echo -e "${YELLOW}请先安装 Hysteria2 才能使用出站规则管理功能${NC}" + echo "" + echo -e "${BLUE}安装建议:${NC}" + echo "1. 返回主菜单选择 '1. 安装 Hysteria2'" + echo "2. 或手动安装: curl -fsSL https://get.hy2.sh/ | bash" + echo "" + read -p "按回车键返回主菜单..." -r + return 1 + fi + + if ! $has_config_dir; then + echo "" + echo -e "${YELLOW}⚠️ 配置目录不存在${NC}" + echo -e "${BLUE}正在创建配置目录: /etc/hysteria${NC}" + + if mkdir -p "/etc/hysteria" 2>/dev/null; then + echo -e "${GREEN}✅ 配置目录创建成功${NC}" + else + echo -e "${RED}❌ 无法创建配置目录,可能需要 root 权限${NC}" + echo "请以 root 用户运行此脚本,或手动创建: sudo mkdir -p /etc/hysteria" + read -p "按回车键继续..." -r + return 1 + fi + fi + + # 检查配置文件是否存在,不存在则创建基础配置 + if [[ ! -f "$HYSTERIA_CONFIG" ]]; then + echo "" + echo -e "${YELLOW}⚠️ 配置文件不存在: $HYSTERIA_CONFIG${NC}" + echo -e "${BLUE}正在创建基础配置文件...${NC}" + + create_basic_hysteria_config + fi + + # 检查配置文件权限 + check_config_file_permissions + + return 0 +} + +# 创建基础 Hysteria2 配置文件 +create_basic_hysteria_config() { + cat > "$HYSTERIA_CONFIG" << 'EOF' +# Hysteria2 服务器配置文件 +# 此文件由 S-HY2 出站规则管理器创建 + +listen: :443 + +# TLS 配置 (请根据实际情况修改) +# tls: +# cert: /path/to/your/cert.crt +# key: /path/to/your/private.key + +# 认证配置 (请根据实际情况修改) +auth: + type: password + password: "your_password_here" + +# 混淆配置 (可选) +# obfs: +# type: salamander +# salamander: +# password: "your_obfs_password" + +# 出站配置将由规则管理器自动管理 +# outbounds 段落请勿手动编辑 +EOF + + if [[ -f "$HYSTERIA_CONFIG" ]]; then + echo -e "${GREEN}✅ 基础配置文件创建成功${NC}" + echo -e "${YELLOW}⚠️ 请编辑配置文件设置 TLS 证书和认证密码:${NC}" + echo -e "${CYAN} $HYSTERIA_CONFIG${NC}" + else + echo -e "${RED}❌ 配置文件创建失败${NC}" + return 1 + fi +} + +# 检查和修复配置文件权限 +check_config_file_permissions() { + if [[ ! -f "$HYSTERIA_CONFIG" ]]; then + return 1 + fi + + # 检查文件权限 + local file_perms=$(stat -c "%a" "$HYSTERIA_CONFIG" 2>/dev/null || stat -f "%A" "$HYSTERIA_CONFIG" 2>/dev/null || echo "unknown") + + # 如果权限太严格,修复权限 + if [[ "$file_perms" == "600" ]] || [[ "$file_perms" == "700" ]]; then + echo "" + echo -e "${YELLOW}⚠️ 配置文件权限过于严格: $file_perms${NC}" + echo -e "${BLUE}正在修复权限...${NC}" + + if chmod 644 "$HYSTERIA_CONFIG" 2>/dev/null; then + echo -e "${GREEN}✅ 权限修复成功 (644)${NC}" + else + echo -e "${RED}❌ 权限修复失败,可能需要 root 权限${NC}" + echo "请手动执行: sudo chmod 644 $HYSTERIA_CONFIG" + fi + fi + + # 检查目录权限 + local config_dir=$(dirname "$HYSTERIA_CONFIG") + if [[ ! -r "$config_dir" ]]; then + echo -e "${YELLOW}⚠️ 配置目录权限问题${NC}" + echo "请检查目录权限: $config_dir" + fi } # 显示出站管理菜单 @@ -571,7 +705,7 @@ delete_existing_rule_silent() { fi # 应用修改 - if mv "$temp_config" "$HYSTERIA_CONFIG" 2>/dev/null; then + if safe_move_config "$temp_config" "$HYSTERIA_CONFIG"; then echo -e "${GREEN}[SUCCESS]${NC} 现有规则 '$rule_name' 已删除" return 0 else @@ -906,7 +1040,7 @@ EOF # 应用配置 echo -e "${BLUE}[INFO]${NC} 应用新配置" - if mv "$temp_file" "$HYSTERIA_CONFIG" 2>/dev/null; then + if safe_move_config "$temp_file" "$HYSTERIA_CONFIG"; then echo -e "${GREEN}[SUCCESS]${NC} 配置已成功应用" return 0 else @@ -2128,6 +2262,20 @@ apply_rule_to_config_simple() { ' "$RULES_LIBRARY" } + # 安全移动配置文件并修复权限 + safe_move_config() { + local temp_file="$1" + local target_file="$2" + + if mv "$temp_file" "$target_file" 2>/dev/null; then + # 修复配置文件权限,确保 Hysteria2 服务可以读取 + chmod 644 "$target_file" 2>/dev/null + return 0 + else + return 1 + fi + } + # 先提取配置参数(在使用前定义变量)- 完整参数支持 local mode="" bindDevice="" bindIPv4="" bindIPv6="" fastOpen="" local addr="" username="" password="" url="" insecure="" @@ -2277,7 +2425,14 @@ EOF # 应用配置 if [[ -s "$temp_config" ]]; then - mv "$temp_config" "$HYSTERIA_CONFIG" + if safe_move_config "$temp_config" "$HYSTERIA_CONFIG"; then + log_debug "配置文件权限已修复为 644" + else + log_error "配置应用失败" + rm -f "$temp_config" + return 1 + fi + log_success "规则 '$rule_name' 已应用到配置文件" # 更新状态文件 @@ -2770,7 +2925,7 @@ delete_outbound_rule_new() { fi done < "$HYSTERIA_CONFIG" - mv "$temp_config" "$HYSTERIA_CONFIG" + safe_move_config "$temp_config" "$HYSTERIA_CONFIG" fi # 从状态文件中移除