- 奶油纸背景、薄荷主色、pill 输入/按钮、3D 按压阴影 - 焦点黄高亮、Title 飘带、圆角卡片表 - 仍为单文件静态 HTML,无 React/npm,适合 512MB
143 lines
4.2 KiB
Bash
Executable File
143 lines
4.2 KiB
Bash
Executable File
#!/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:-<empty>}"
|
||
if [[ -n "${PROXY_PASS:-}" ]]; then
|
||
echo "PROXY_PASS=$(mask "$PROXY_PASS") (已设置)"
|
||
else
|
||
echo "PROXY_PASS=<empty> (无鉴权)"
|
||
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
|