修复管道执行模式:支持 curl | bash 非交互式部署

- 新增 is_piped() 检测 stdin 是否为 tty
- 新增 read_or_default() 函数,管道模式下自动使用环境变量或默认值
- 所有 read -p 交互式输入替换为 read_or_default
- 支持环境变量覆盖: GATEWAY_PORT/REMOTE_PORT/APPEND_FRP/USE_VENV/INSTALL_FRP
- 修复 curl | bash 执行时 read 导致端口验证失败的 bug
This commit is contained in:
2026-07-02 14:45:47 +08:00
parent f480f251fb
commit a6fbf3c175
+30 -11
View File
@@ -13,7 +13,31 @@ log_warn() { echo -e "${YELLOW}[WARN]${PLAIN} $1"; }
log_error() { echo -e "${RED}[ERROR]${PLAIN} $1"; } log_error() { echo -e "${RED}[ERROR]${PLAIN} $1"; }
log_step() { echo -e "\n${BLUE}[${1}]${PLAIN} ${2}"; } log_step() { echo -e "\n${BLUE}[${1}]${PLAIN} ${2}"; }
# 检是否有 systemd # 检是否在管道中运行(stdin 不是 tty)
is_piped() {
[ ! -t 0 ]
}
# 交互式读取或自动使用默认值
read_or_default() {
local prompt_msg="$1"
local default_value="$2"
local var_name="$3"
if is_piped; then
# 管道模式:检查环境变量,否则使用默认值
local env_val="${!var_name}"
if [ -n "$env_val" ]; then
echo "$env_val"
else
echo "$default_value"
fi
else
# 交互模式:正常 read
read -p "$prompt_msg" input_val
echo "${input_val:-$default_value}"
fi
}
has_systemd() { has_systemd() {
[ -d /run/systemd/system ] || [ -d /var/run/systemd/system ] || systemctl --version &>/dev/null [ -d /run/systemd/system ] || [ -d /var/run/systemd/system ] || systemctl --version &>/dev/null
} }
@@ -89,8 +113,7 @@ fi
log_step "1/5" "正在检测 frpc 环境..." log_step "1/5" "正在检测 frpc 环境..."
if ! command -v frpc &>/dev/null && [ ! -f "/usr/local/bin/frpc" ] && [ ! -f "/usr/bin/frpc" ]; then if ! command -v frpc &>/dev/null && [ ! -f "/usr/local/bin/frpc" ] && [ ! -f "/usr/bin/frpc" ]; then
log_warn "未检测到 frpc" log_warn "未检测到 frpc"
read -p "是否需要为您自动下载并安装最新版 frpc (使用国内加速镜像)? (y/n, 默认 y): " INSTALL_FRP INSTALL_FRP=$(read_or_default "是否需要为您自动下载并安装最新版 frpc (使用国内加速镜像)? (y/n, 默认 y): " "y" "INSTALL_FRP")
INSTALL_FRP=${INSTALL_FRP:-y}
if [[ "$INSTALL_FRP" == "y" || "$INSTALL_FRP" == "Y" ]]; then if [[ "$INSTALL_FRP" == "y" || "$INSTALL_FRP" == "Y" ]]; then
ARCH=$(uname -m) ARCH=$(uname -m)
@@ -177,11 +200,9 @@ fi
# ================= 配置网关与映射端口 ================= # ================= 配置网关与映射端口 =================
log_step "2/5" "配置动态网关参数:" log_step "2/5" "配置动态网关参数:"
read -p "请输入 Python 动态网关的本地监听端口 (默认 8080): " GATEWAY_PORT
GATEWAY_PORT=${GATEWAY_PORT:-8080}
read -p "请输入你想在 frps 公网端暴露的端口 (默认 18000): " REMOTE_PORT GATEWAY_PORT=$(read_or_default "请输入 Python 动态网关的本地监听端口 (默认 8080): " "8080" "GATEWAY_PORT")
REMOTE_PORT=${REMOTE_PORT:-18000} REMOTE_PORT=$(read_or_default "请输入你想在 frps 公网端暴露的端口 (默认 18000): " "18000" "REMOTE_PORT")
# 端口有效性检查 # 端口有效性检查
if ! [[ "$GATEWAY_PORT" =~ ^[0-9]+$ ]] || [ "$GATEWAY_PORT" -lt 1 ] || [ "$GATEWAY_PORT" -gt 65535 ]; then if ! [[ "$GATEWAY_PORT" =~ ^[0-9]+$ ]] || [ "$GATEWAY_PORT" -lt 1 ] || [ "$GATEWAY_PORT" -gt 65535 ]; then
@@ -219,8 +240,7 @@ fi
APPEND_FRP="n" APPEND_FRP="n"
if [ -n "$FRPC_CONFIG" ]; then if [ -n "$FRPC_CONFIG" ]; then
log_info "识别到 frpc 配置: $FRPC_CONFIG (${FRPC_TYPE})" log_info "识别到 frpc 配置: $FRPC_CONFIG (${FRPC_TYPE})"
read -p "是否自动将华为云转发规则追加到该文件? (y/n, 默认 y): " APPEND_FRP APPEND_FRP=$(read_or_default "是否自动将华为云转发规则追加到该文件? (y/n, 默认 y): " "y" "APPEND_FRP")
APPEND_FRP=${APPEND_FRP:-y}
else else
log_warn "未找到 frpc 配置文件,跳过自动追加" log_warn "未找到 frpc 配置文件,跳过自动追加"
log_warn "请手动在 frpc 配置中添加以下规则:" log_warn "请手动在 frpc 配置中添加以下规则:"
@@ -272,8 +292,7 @@ fi
USE_VENV=false USE_VENV=false
VENV_PATH="/opt/huawei-gateway/venv" VENV_PATH="/opt/huawei-gateway/venv"
if [ "$IS_CONTAINER" = true ] || [ "$EUID" -eq 0 ]; then if [ "$IS_CONTAINER" = true ] || [ "$EUID" -eq 0 ]; then
read -p "是否使用虚拟环境安装 Python 依赖? (推荐, y/n, 默认 y): " USE_VENV_INPUT USE_VENV_INPUT=$(read_or_default "是否使用虚拟环境安装 Python 依赖? (推荐, y/n, 默认 y): " "y" "USE_VENV")
USE_VENV_INPUT=${USE_VENV_INPUT:-y}
[[ "$USE_VENV_INPUT" == "y" || "$USE_VENV_INPUT" == "Y" ]] && USE_VENV=true [[ "$USE_VENV_INPUT" == "y" || "$USE_VENV_INPUT" == "Y" ]] && USE_VENV=true
fi fi