修复管道执行模式:支持 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:
+30
-11
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user