#!/usr/bin/env bash # 设置/清除代理账号密码,写 settings → 重生 config → 重启服务 # 用法: # apply-proxy-auth.sh --user U --pass P # apply-proxy-auth.sh --clear # apply-proxy-auth.sh --show set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # shellcheck source=lib.sh source "$ROOT_DIR/scripts/lib.sh" ACTION=set USER_V="" PASS_V="" usage() { cat <<'H' apply-proxy-auth.sh — 配置 7890 代理鉴权 --user NAME 代理用户名 --pass PASS 代理密码 --clear 清除鉴权(无密码) --show 仅显示当前状态(密码脱敏) -h|--help H } while [[ $# -gt 0 ]]; do case "$1" in --user) USER_V="${2:-}"; shift 2 ;; --pass) PASS_V="${2:-}"; shift 2 ;; --clear) ACTION=clear; shift ;; --show) ACTION=show; shift ;; -h|--help) usage; exit 0 ;; *) die "未知参数: $1" ;; esac done # 优先已安装配置 if [[ -f "${INSTALL_DIR:-/opt/cellular-proxy}/etc/settings.conf" ]]; then CONFIG_FILE="${INSTALL_DIR:-/opt/cellular-proxy}/etc/settings.conf" SETTINGS_DIR="$(dirname "$CONFIG_FILE")" elif [[ -f "$ROOT_DIR/config/settings.conf" ]]; then CONFIG_FILE="$ROOT_DIR/config/settings.conf" SETTINGS_DIR="$(dirname "$CONFIG_FILE")" else die "找不到 settings.conf(请先安装)" fi set_kv() { local file="$1" key="$2" val="$3" local tmp tmp="$(mktemp)" awk -v k="$key" -v v="$val" ' BEGIN { done=0 } index($0, k "=")==1 { print k "=" v; done=1; next } { print } END { if (!done) print k "=" v } ' "$file" > "$tmp" mv "$tmp" "$file" } load_config INSTALL_DIR="${INSTALL_DIR:-/opt/cellular-proxy}" mask() { local s="$1" n=${#1} if [[ $n -le 2 ]]; then echo "***"; else echo "${s:0:1}***${s: -1}"; fi } if [[ "$ACTION" == "show" ]]; then echo "settings: $CONFIG_FILE" echo "PROXY_USER=${PROXY_USER:-}" if [[ -n "${PROXY_PASS:-}" ]]; then echo "PROXY_PASS=$(mask "$PROXY_PASS") (已设置)" else echo "PROXY_PASS= (无鉴权)" fi exit 0 fi need_root if [[ "$ACTION" == "clear" ]]; then set_kv "$CONFIG_FILE" PROXY_USER "" set_kv "$CONFIG_FILE" PROXY_PASS "" info "已清除代理账号密码" else [[ -n "$USER_V" ]] || die "请指定 --user(或用 --clear)" [[ -n "$PASS_V" ]] || die "请指定 --pass" set_kv "$CONFIG_FILE" PROXY_USER "$USER_V" set_kv "$CONFIG_FILE" PROXY_PASS "$PASS_V" info "已写入 PROXY_USER=$USER_V" fi # 同步到安装树副本 if [[ -f "$INSTALL_DIR/etc/settings.conf" && "$CONFIG_FILE" != "$INSTALL_DIR/etc/settings.conf" ]]; then install -m 0644 "$CONFIG_FILE" "$INSTALL_DIR/etc/settings.conf" fi # 若改的是安装目录,也尽量同步源树 if [[ -d "$ROOT_DIR/config" && "$CONFIG_FILE" == "$INSTALL_DIR/etc/settings.conf" ]]; then install -m 0644 "$CONFIG_FILE" "$ROOT_DIR/config/settings.conf" 2>/dev/null || true fi export CONFIG_FILE # generate 需要能 load 到最新 settings if [[ -x "$INSTALL_DIR/scripts/generate.sh" ]]; then GEN="$INSTALL_DIR/scripts/generate.sh" OUT="$INSTALL_DIR/generated" elif [[ -x "$ROOT_DIR/scripts/generate.sh" ]]; then GEN="$ROOT_DIR/scripts/generate.sh" OUT="${INSTALL_DIR}/generated" mkdir -p "$OUT" else die "找不到 generate.sh" fi info "重新生成 sing-box 配置…" "$GEN" "$OUT" install -m 0644 "$OUT/config.json" "$INSTALL_DIR/etc/config.json" install -m 0644 "$OUT/runtime.env" "$INSTALL_DIR/etc/runtime.env" 2>/dev/null || true install -m 0644 "$CONFIG_FILE" "$INSTALL_DIR/etc/settings.conf" if systemctl is-enabled cellular-proxy.service >/dev/null 2>&1 || systemctl list-unit-files | grep -q cellular-proxy; then systemctl restart cellular-proxy.service sleep 1 if systemctl is-active --quiet cellular-proxy.service; then info "服务已重启 active" else warn "服务未 active,请检查: systemctl status cellular-proxy" fi else warn "未找到 systemd 服务,配置已写好,请手动重启 sing-box" fi if [[ "$ACTION" == "clear" ]]; then echo "当前: 无代理鉴权" else echo "当前: 用户 $USER_V / 密码已设置" echo "HTTP: curl -x http://${USER_V}:****@127.0.0.1:${PROXY_MIXED_PORT:-7890} https://ifconfig.me" echo "SOCKS: curl --socks5-hostname ${USER_V}:****@127.0.0.1:${PROXY_MIXED_PORT:-7890} https://ifconfig.me" fi