作为懒人的我,用AI写了一个shell一键脚本,可能有些不完美,但是可以将就着用。功能大概有
- 安装frps服务端
- 安装frpc客户端
- 管理frps或frpc
- 卸载
相关截图:


一键脚本:
bash <(curl -Ls https://shell.yuancode.top/frp/main.sh)
源代码:
#!/bin/bash
# ============================================
# FRP 一键脚本 v1.0
# 支持系统: CentOS/Debian/Ubuntu/Alpine
# ============================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'
# 全局变量
FRP_VERSION=""
FRP_TYPE="" # server/client
GITHUB_MIRROR="https://github.com"
FRP_INSTALL_DIR="/usr/local/frp"
FRP_CONFIG_DIR="/usr/local/frp"
SERVICE_DIR="/etc/systemd/system"
FRP_BIN=""
UPDATE_URL="https://shell.yuancode.top/frp/main.sh"
# ============================================
# 基础函数
# ============================================
print_header() {
clear
echo -e "${CYAN}========================================${NC}"
echo -e "${GREEN} FRP 一键脚本 v1.0 ${NC}"
echo -e "${CYAN}========================================${NC}"
echo ""
}
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
check_root() {
if [[ $EUID -ne 0 ]]; then
print_error "此脚本必须以root权限运行!"
exit 1
fi
}
detect_os() {
if [[ -f /etc/alpine-release ]]; then
OS="alpine"
PKG_MANAGER="apk"
SERVICE_MANAGER="openrc"
elif [[ -f /etc/debian_version ]]; then
OS="debian"
PKG_MANAGER="apt"
SERVICE_MANAGER="systemd"
elif [[ -f /etc/redhat-release ]]; then
OS="redhat"
PKG_MANAGER="yum"
SERVICE_MANAGER="systemd"
else
OS="unknown"
print_error "不支持的操作系统!"
exit 1
fi
print_info "检测到系统: $OS"
}
install_dependencies() {
print_info "安装依赖工具..."
case $PKG_MANAGER in
apk)
apk add --no-cache curl wget tar
;;
apt)
apt update
apt install -y curl wget tar
;;
yum)
yum install -y curl wget tar
;;
esac
}
# ============================================
# GitHub 加速切换
# ============================================
switch_mirror() {
print_header
echo -e "${YELLOW}请选择 GitHub 加速源:${NC}"
echo "1) 官方源 (github.com)"
echo "2) 代理源 (gh.xmly.dev)"
echo "3) 代理源 (github.chenc.dev)"
echo "4) 代理源 (gh-proxy.cn)"
echo "5) 自定义"
echo ""
read -p "请输入选项 [1-5]: " mirror_choice
case $mirror_choice in
1) GITHUB_MIRROR="https://github.com" ;;
2) GITHUB_MIRROR="https://gh.xmly.dev/" ;;
3) GITHUB_MIRROR="https://github.chenc.dev/" ;;
4) GITHUB_MIRROR="https://gh-proxy.cn/" ;;
5)
read -p "请输入自定义镜像地址: " custom_mirror
GITHUB_MIRROR="$custom_mirror"
;;
*)
print_error "无效选项"
return
;;
esac
print_success "当前镜像源: $GITHUB_MIRROR"
read -p "按回车键继续..."
}
# ============================================
# 获取版本列表
# ============================================
get_version_list() {
print_info "正在获取 FRP 版本列表..."
# 使用不同的源尝试获取
local api_urls=(
"https://api.github.com/repos/fatedier/frp/releases"
)
local releases_json=""
for url in "${api_urls[@]}"; do
releases_json=$(curl -s "$url" 2>/dev/null || echo "")
if [[ -n "$releases_json" && "$releases_json" != *"API rate limit"* ]]; then
break
fi
done
if [[ -z "$releases_json" || "$releases_json" == *"API rate limit"* ]]; then
print_warning "无法获取版本列表,将使用默认版本"
echo "v0.52.3"
echo "v0.51.3"
echo "v0.50.0"
return
fi
echo "$releases_json" | grep -o '"tag_name": "[^"]*"' | sed 's/"tag_name": "//g' | sed 's/"//g' | grep -v "rc" | head -20
}
select_version() {
print_header
echo -e "${YELLOW}请选择安装版本:${NC}"
echo "1) 最新版本"
echo "2) 指定版本"
echo ""
read -p "请输入选项 [1-2]: " version_choice
if [[ $version_choice -eq 2 ]]; then
echo -e "${CYAN}可用的版本列表:${NC}"
version_list=$(get_version_list)
echo "$version_list" | nl -w2 -s') '
echo ""
read -p "请输入版本号 (如 v0.52.3): " FRP_VERSION
if [[ -z "$FRP_VERSION" ]]; then
print_error "版本号不能为空"
select_version
return
fi
else
# 获取最新版本
print_info "获取最新版本..."
local latest_version=$(curl -s "https://api.github.com/repos/fatedier/frp/releases/latest" | grep -o '"tag_name": "[^"]*"' | sed 's/"tag_name": "//g' | sed 's/"//g')
if [[ -z "$latest_version" ]]; then
latest_version="v0.52.3"
fi
FRP_VERSION="$latest_version"
fi
print_success "选择版本: $FRP_VERSION"
}
# ============================================
# 配置文件生成
# ============================================
generate_frps_config() {
print_header
echo -e "${GREEN}配置 FRPS (服务端) 参数${NC}"
echo ""
# 基础配置
read -p "绑定端口 [7000]: " bind_port
bind_port=${bind_port:-7000}
read -p "绑定地址 [0.0.0.0]: " bind_addr
bind_addr=${bind_addr:-0.0.0.0}
# Token 认证
read -p "认证 Token (留空自动生成): " auth_token
if [[ -z "$auth_token" ]]; then
auth_token=$(openssl rand -base64 32 | tr -d "=+/" | cut -c1-32)
print_info "自动生成 Token: $auth_token"
fi
# Dashboard 配置
read -p "是否启用 Web Dashboard (y/n) [y]: " enable_dashboard
enable_dashboard=${enable_dashboard:-y}
if [[ "$enable_dashboard" == "y" ]]; then
read -p "Dashboard 端口 [7500]: " dashboard_port
dashboard_port=${dashboard_port:-7500}
read -p "Dashboard 用户名 [admin]: " dashboard_user
dashboard_user=${dashboard_user:-admin}
read -p "Dashboard 密码 [admin123]: " dashboard_pwd
dashboard_pwd=${dashboard_pwd:-admin123}
read -p "是否启用 API (y/n) [n]: " enable_api
enable_api=${enable_api:-n}
fi
# 日志配置
read -p "日志级别 (debug/info/warn/error) [info]: " log_level
log_level=${log_level:-info}
read -p "日志保留天数 [3]: " log_max_days
log_max_days=${log_max_days:-3}
# 生成配置文件
mkdir -p "$FRP_CONFIG_DIR"
cat > "$FRP_CONFIG_DIR/frps.toml" << EOF
# FRPS 配置文件
bindAddr = "${bind_addr}"
bindPort = ${bind_port}
auth.token = "${auth_token}"
# 日志
log.level = "${log_level}"
log.maxDays = ${log_max_days}
log.disablePrintColor = false
EOF
if [[ "$enable_dashboard" == "y" ]]; then
cat >> "$FRP_CONFIG_DIR/frps.toml" << EOF
# Web Dashboard
webServer.addr = "${bind_addr}"
webServer.port = ${dashboard_port}
webServer.user = "${dashboard_user}"
webServer.password = "${dashboard_pwd}"
webServer.assetsDir = "/usr/local/frp/web"
webServer.open = true
EOF
if [[ "$enable_api" == "y" ]]; then
cat >> "$FRP_CONFIG_DIR/frps.toml" << EOF
# API
webServer.enableApi = true
webServer.enablePprof = false
EOF
fi
fi
print_success "配置文件已生成: $FRP_CONFIG_DIR/frps.toml"
# 保存连接信息
echo "$bind_addr:$bind_port" > "$FRP_CONFIG_DIR/.connection_info"
echo "$auth_token" >> "$FRP_CONFIG_DIR/.connection_info"
if [[ "$enable_dashboard" == "y" ]]; then
echo "http://${bind_addr}:${dashboard_port}" >> "$FRP_CONFIG_DIR/.connection_info"
echo "$dashboard_user" >> "$FRP_CONFIG_DIR/.connection_info"
echo "$dashboard_pwd" >> "$FRP_CONFIG_DIR/.connection_info"
fi
}
generate_frpc_config() {
print_header
echo -e "${GREEN}配置 FRPC (客户端) 参数${NC}"
echo ""
# 服务器配置
read -p "服务器地址 (IP或域名): " server_addr
if [[ -z "$server_addr" ]]; then
print_error "服务器地址不能为空!"
generate_frpc_config
return
fi
read -p "服务器端口 [7000]: " server_port
server_port=${server_port:-7000}
read -p "认证 Token: " auth_token
if [[ -z "$auth_token" ]]; then
print_error "Token 不能为空!"
generate_frpc_config
return
fi
# 协议配置
read -p "使用 WebSocket 协议 (y/n) [n]: " use_websocket
use_websocket=${use_websocket:-n}
# 日志配置
read -p "日志级别 (debug/info/warn/error) [info]: " log_level
log_level=${log_level:-info}
read -p "日志保留天数 [3]: " log_max_days
log_max_days=${log_max_days:-3}
# 代理配置
echo ""
echo -e "${CYAN}配置代理规则 (至少一个)${NC}"
declare -a proxies
proxy_count=0
while true; do
((proxy_count++))
echo ""
echo -e "${YELLOW}代理 #${proxy_count}${NC}"
read -p "代理名称: " proxy_name
if [[ -z "$proxy_name" ]]; then
if [[ $proxy_count -eq 1 ]]; then
print_error "至少需要一个代理!"
continue
else
break
fi
fi
read -p "代理类型 (tcp/udp/http/https/stcp/xtcp) [tcp]: " proxy_type
proxy_type=${proxy_type:-tcp}
read -p "本地IP [127.0.0.1]: " local_ip
local_ip=${local_ip:-127.0.0.1}
read -p "本地端口: " local_port
if [[ -z "$local_port" ]]; then
print_error "本地端口不能为空!"
((proxy_count--))
continue
fi
read -p "远程端口: " remote_port
if [[ -z "$remote_port" ]]; then
print_error "远程端口不能为空!"
((proxy_count--))
continue
fi
proxies+=("name=$proxy_name|type=$proxy_type|local_ip=$local_ip|local_port=$local_port|remote_port=$remote_port")
read -p "是否继续添加代理? (y/n) [y]: " continue_add
if [[ "${continue_add:-y}" != "y" ]]; then
break
fi
done
# 生成配置文件
mkdir -p "$FRP_CONFIG_DIR"
cat > "$FRP_CONFIG_DIR/frpc.toml" << EOF
# FRPC 配置文件
serverAddr = "${server_addr}"
serverPort = ${server_port}
auth.token = "${auth_token}"
# 传输协议
transport.protocol = "$([ "$use_websocket" == "y" ] && echo "websocket" || echo "tcp")"
# 日志
log.level = "${log_level}"
log.maxDays = ${log_max_days}
EOF
# 添加代理配置
for proxy in "${proxies[@]}"; do
eval $(echo "$proxy" | awk -F'|' '{for(i=1;i<=NF;i++){split($i,a,"="); printf "%s=\"%s\" ", a[1], a[2]}}')
cat >> "$FRP_CONFIG_DIR/frpc.toml" << EOF
[[proxies]]
name = "${name}"
type = "${type}"
localIP = "${local_ip}"
localPort = ${local_port}
remotePort = ${remote_port}
EOF
done
print_success "配置文件已生成: $FRP_CONFIG_DIR/frpc.toml"
# 保存连接信息
echo "$server_addr:$server_port" > "$FRP_CONFIG_DIR/.connection_info"
echo "$auth_token" >> "$FRP_CONFIG_DIR/.connection_info"
}
# ============================================
# 安装 FRP
# ============================================
download_and_install() {
local frp_type=$1
local arch=$(uname -m)
# 检测架构
case $arch in
x86_64) ARCH="amd64" ;;
aarch64) ARCH="arm64" ;;
armv7l) ARCH="arm" ;;
*)
print_error "不支持的架构: $arch"
exit 1
;;
esac
print_info "系统架构: $ARCH"
# 确定下载文件名
local download_url="${GITHUB_MIRROR}/fatedier/frp/releases/download/${FRP_VERSION}/frp_${FRP_VERSION#v}_linux_${ARCH}.tar.gz"
print_info "下载地址: $download_url"
# 创建临时目录
local tmp_dir=$(mktemp -d)
cd "$tmp_dir"
print_info "正在下载 FRP..."
if ! wget -q "$download_url" -O frp.tar.gz; then
print_error "下载失败! 请检查版本号或网络连接"
rm -rf "$tmp_dir"
exit 1
fi
print_info "正在解压..."
tar -xzf frp.tar.gz
# 进入解压目录
local extract_dir=$(ls -d frp_* 2>/dev/null | head -1)
if [[ -z "$extract_dir" ]]; then
print_error "解压失败!"
rm -rf "$tmp_dir"
exit 1
fi
cd "$extract_dir"
# 安装文件
mkdir -p "$FRP_INSTALL_DIR"
mkdir -p "$FRP_CONFIG_DIR"
if [[ "$frp_type" == "server" ]]; then
cp frps "$FRP_INSTALL_DIR/"
chmod +x "$FRP_INSTALL_DIR/frps"
# 复制 web 文件
if [[ -d "web" ]]; then
cp -r web "$FRP_INSTALL_DIR/"
fi
FRP_BIN="$FRP_INSTALL_DIR/frps"
else
cp frpc "$FRP_INSTALL_DIR/"
chmod +x "$FRP_INSTALL_DIR/frpc"
FRP_BIN="$FRP_INSTALL_DIR/frpc"
fi
# 清理临时文件
cd /
rm -rf "$tmp_dir"
print_success "FRP 安装成功!"
}
create_system_service() {
local frp_type=$1
local service_name="frp${frp_type:0:1}"
local bin_name="frp${frp_type:0:1}"
local config_file="$FRP_CONFIG_DIR/${bin_name}.toml"
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
cat > "$SERVICE_DIR/${service_name}.service" << EOF
[Unit]
Description=FRP ${frp_type}
After=network.target
Wants=network.target
[Service]
Type=simple
ExecStart=${FRP_INSTALL_DIR}/${bin_name} -c ${config_file}
ExecReload=/bin/kill -HUP \$MAINPID
ExecStop=/bin/kill -TERM \$MAINPID
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal
User=root
Group=root
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable "${service_name}.service"
systemctl start "${service_name}.service"
print_success "已创建并启动系统服务: ${service_name}.service"
elif [[ "$SERVICE_MANAGER" == "openrc" ]]; then
# Alpine 使用 OpenRC
cat > "/etc/init.d/${service_name}" << EOF
#!/sbin/openrc-run
name="FRP ${frp_type}"
description="FRP ${frp_type} service"
command="${FRP_INSTALL_DIR}/${bin_name}"
command_args="-c ${config_file}"
command_user="root"
pidfile="/run/${service_name}.pid"
command_background=true
depend() {
need net
use dns
after firewall
}
EOF
chmod +x "/etc/init.d/${service_name}"
rc-update add "${service_name}" default
rc-service "${service_name}" start
print_success "已创建并启动系统服务: ${service_name}"
fi
}
# ============================================
# 安装主函数
# ============================================
install_frp() {
local frp_type=$1
FRP_TYPE=$frp_type
print_header
echo -e "${YELLOW}开始安装 FRP ${frp_type}...${NC}"
echo ""
# 检测系统
detect_os
check_root
install_dependencies
# 选择版本
select_version
# 生成配置
if [[ "$frp_type" == "server" ]]; then
generate_frps_config
else
generate_frpc_config
fi
# 下载并安装
download_and_install "$frp_type"
# 创建系统服务
create_system_service "$frp_type"
# 显示连接信息
show_connection_info "$frp_type"
}
# ============================================
# 显示连接信息
# ============================================
show_connection_info() {
local frp_type=$1
print_header
echo -e "${GREEN}============ 安装完成 ============${NC}"
echo ""
if [[ "$frp_type" == "server" ]]; then
echo -e "${CYAN}FRPS (服务端) 信息:${NC}"
if [[ -f "$FRP_CONFIG_DIR/.connection_info" ]]; then
local info=$(cat "$FRP_CONFIG_DIR/.connection_info")
local line1=$(echo "$info" | sed -n '1p')
local line2=$(echo "$info" | sed -n '2p')
local line3=$(echo "$info" | sed -n '3p')
local line4=$(echo "$info" | sed -n '4p')
local line5=$(echo "$info" | sed -n '5p')
echo -e " 监听地址: ${GREEN}${line1}${NC}"
echo -e " 认证Token: ${GREEN}${line2}${NC}"
if [[ -n "$line3" ]]; then
echo ""
echo -e "${CYAN}Web Dashboard:${NC}"
echo -e " 访问地址: ${GREEN}${line3}${NC}"
echo -e " 用户名: ${GREEN}${line4}${NC}"
echo -e " 密码: ${GREEN}${line5}${NC}"
fi
fi
else
echo -e "${CYAN}FRPC (客户端) 信息:${NC}"
if [[ -f "$FRP_CONFIG_DIR/.connection_info" ]]; then
local info=$(cat "$FRP_CONFIG_DIR/.connection_info")
local line1=$(echo "$info" | sed -n '1p')
local line2=$(echo "$info" | sed -n '2p')
echo -e " 服务器地址: ${GREEN}${line1}${NC}"
echo -e " 认证Token: ${GREEN}${line2}${NC}"
fi
fi
echo ""
echo -e "${CYAN}服务管理命令:${NC}"
local service_name="frp${frp_type:0:1}"
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
echo -e " 启动: ${GREEN}systemctl start ${service_name}${NC}"
echo -e " 停止: ${GREEN}systemctl stop ${service_name}${NC}"
echo -e " 重启: ${GREEN}systemctl restart ${service_name}${NC}"
echo -e " 状态: ${GREEN}systemctl status ${service_name}${NC}"
echo -e " 日志: ${GREEN}journalctl -u ${service_name} -f${NC}"
else
echo -e " 启动: ${GREEN}rc-service ${service_name} start${NC}"
echo -e " 停止: ${GREEN}rc-service ${service_name} stop${NC}"
echo -e " 重启: ${GREEN}rc-service ${service_name} restart${NC}"
echo -e " 状态: ${GREEN}rc-service ${service_name} status${NC}"
echo -e " 日志: ${GREEN}cat /var/log/${service_name}.log${NC}"
fi
echo ""
echo -e "${GREEN}==================================${NC}"
read -p "按回车键返回主菜单..."
}
# ============================================
# 服务管理功能
# ============================================
manage_service() {
local frp_type=$1
local service_name="frp${frp_type:0:1}"
while true; do
print_header
echo -e "${YELLOW}FRP ${frp_type} 管理面板${NC}"
echo ""
echo "1) 启动服务"
echo "2) 停止服务"
echo "3) 重启服务"
echo "4) 查看状态"
echo "5) 查看日志"
echo "6) 重新配置"
echo "7) 开启/关闭 开机自启"
echo "8) 卸载 FRP ${frp_type}"
echo "9) 返回主菜单"
echo ""
read -p "请输入选项 [1-9]: " manage_choice
case $manage_choice in
1)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl start "$service_name"
else
rc-service "$service_name" start
fi
print_success "服务已启动"
;;
2)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl stop "$service_name"
else
rc-service "$service_name" stop
fi
print_success "服务已停止"
;;
3)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl restart "$service_name"
else
rc-service "$service_name" restart
fi
print_success "服务已重启"
;;
4)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl status "$service_name"
else
rc-service "$service_name" status
fi
read -p "按回车键继续..."
;;
5)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
journalctl -u "$service_name" -n 50
else
if [[ -f "/var/log/${service_name}.log" ]]; then
tail -50 "/var/log/${service_name}.log"
else
print_error "日志文件不存在"
fi
fi
read -p "按回车键继续..."
;;
6)
print_info "重新配置 ${frp_type}..."
if [[ "$frp_type" == "server" ]]; then
generate_frps_config
else
generate_frpc_config
fi
# 重启服务
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl restart "$service_name"
else
rc-service "$service_name" restart
fi
print_success "配置已更新并重启服务"
read -p "按回车键继续..."
;;
7)
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
if systemctl is-enabled "$service_name" >/dev/null 2>&1; then
systemctl disable "$service_name"
print_info "已禁用开机自启"
else
systemctl enable "$service_name"
print_info "已启用开机自启"
fi
else
if rc-update show | grep -q "$service_name"; then
rc-update del "$service_name"
print_info "已禁用开机自启"
else
rc-update add "$service_name" default
print_info "已启用开机自启"
fi
fi
read -p "按回车键继续..."
;;
8)
uninstall_frp "$frp_type"
return
;;
9)
return
;;
*)
print_error "无效选项"
;;
esac
done
}
# ============================================
# 卸载功能
# ============================================
uninstall_frp() {
local frp_type=$1
local service_name="frp${frp_type:0:1}"
print_header
echo -e "${RED}警告: 即将卸载 FRP ${frp_type}${NC}"
echo ""
read -p "确定要卸载吗? (y/n): " confirm
if [[ "$confirm" != "y" ]]; then
print_info "取消卸载"
return
fi
# 停止服务
if [[ "$SERVICE_MANAGER" == "systemd" ]]; then
systemctl stop "$service_name" 2>/dev/null
systemctl disable "$service_name" 2>/dev/null
rm -f "$SERVICE_DIR/${service_name}.service"
systemctl daemon-reload
else
rc-service "$service_name" stop 2>/dev/null
rc-update del "$service_name" 2>/dev/null
rm -f "/etc/init.d/${service_name}"
fi
# 删除文件
local bin_name="frp${frp_type:0:1}"
rm -f "$FRP_INSTALL_DIR/${bin_name}"
# 询问是否删除配置
read -p "是否删除配置文件? (y/n): " del_config
if [[ "$del_config" == "y" ]]; then
rm -rf "$FRP_CONFIG_DIR"
print_info "配置文件已删除"
fi
# 如果FRP目录为空,删除
if [[ -z "$(ls -A "$FRP_INSTALL_DIR" 2>/dev/null)" ]]; then
rm -rf "$FRP_INSTALL_DIR"
fi
print_success "FRP ${frp_type} 已卸载"
read -p "按回车键返回主菜单..."
}
# ============================================
# 更新功能
# ============================================
update_panel() {
print_header
echo -e "${YELLOW}更新面板...${NC}"
echo ""
read -p "是否检查更新? (y/n): " check_update
if [[ "$check_update" == "y" ]]; then
print_info "正在检查更新..."
local script_url="${UPDATE_URL}"
if wget -q --spider "$script_url"; then
wget -q -O /usr/local/frp/frp-manager.sh "$script_url"
if [[ -f "/usr/local/frp/frp-manager.sh" ]]; then
chmod +x /usr/local/frp/frp-manager.sh
print_success "更新成功! 请重新运行脚本"
exit 0
fi
else
print_error "检查更新失败"
fi
fi
read -p "按回车键返回主菜单..."
}
# ============================================
# 获取安装状态
# ============================================
get_install_status() {
local status="未安装"
local color=$RED
if [[ -f "$FRP_INSTALL_DIR/frps" ]]; then
status="已安装 (服务端)"
color=$GREEN
elif [[ -f "$FRP_INSTALL_DIR/frpc" ]]; then
status="已安装 (客户端)"
color=$GREEN
fi
echo -e "${color}${status}${NC}"
}
# ============================================
# 主菜单
# ============================================
main_menu() {
while true; do
print_header
echo -e "${CYAN}当前镜像源:${NC} $GITHUB_MIRROR"
echo -e "${CYAN}安装状态:${NC} $(get_install_status)"
echo ""
echo "1) 安装 FRPS (服务端)"
echo "2) 安装 FRPC (客户端)"
echo "3) 管理 FRPS (服务端)"
echo "4) 管理 FRPC (客户端)"
echo "5) 切换 GitHub 加速源"
echo "6) 更新面板"
echo "7) 退出"
echo ""
read -p "请选择操作 [1-7]: " main_choice
case $main_choice in
1)
install_frp "server"
;;
2)
install_frp "client"
;;
3)
if [[ -f "$FRP_INSTALL_DIR/frps" ]]; then
manage_service "server"
else
print_error "FRPS 未安装!"
read -p "按回车键继续..."
fi
;;
4)
if [[ -f "$FRP_INSTALL_DIR/frpc" ]]; then
manage_service "client"
else
print_error "FRPC 未安装!"
read -p "按回车键继续..."
fi
;;
5)
switch_mirror
;;
6)
update_panel
;;
7)
echo -e "${GREEN}感谢使用!${NC}"
exit 0
;;
*)
print_error "无效选项"
read -p "按回车键继续..."
;;
esac
done
}
# ============================================
# 注册管理命令
# ============================================
register_command() {
# 创建全局命令
cat > /usr/local/bin/frp << EOF
#!/bin/bash
if [[ -f "$FRP_INSTALL_DIR/frp-manager.sh" ]]; then
"$FRP_INSTALL_DIR/frp-manager.sh"
else
echo "错误: FRP 管理脚本未找到!"
wget -O ${FRP_INSTALL_DIR}/frp-manager.sh ${UPDATE_URL} && chmod +x ${FRP_INSTALL_DIR}/frp-manager.sh && ./${FRP_INSTALL_DIR}/frp-manager.sh
exit 1
frp
fi
EOF
chmod +x /usr/local/bin/frp
print_success "已注册管理命令: frp"
print_info "现在您可以直接在终端输入 'frp' 打开管理面板"
}
# ============================================
# 初始化
# ============================================
init() {
check_root
detect_os
install_dependencies
# 注册命令
register_command
# 进入主菜单
main_menu
}
# 运行
init
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END


![[镜像]宝塔WAF-开心版-Jv' Blog](https://free.picui.cn/free/2026/07/08/6a4df62d6f769.png)
![[镜像]宝塔面板-开心版-Jv' Blog](https://free.picui.cn/free/2026/07/09/6a4f650308a07.jpg)
暂无评论内容