Frps、Frpc一键安装脚本

作为懒人的我,用AI写了一个shell一键脚本,可能有些不完美,但是可以将就着用。功能大概有

  • 安装frps服务端
  • 安装frpc客户端
  • 管理frps或frpc
  • 卸载

相关截图:

Frps、Frpc一键安装脚本-Jv' Blog

Frps、Frpc一键安装脚本-Jv' Blog

 

一键脚本:

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

 

 

 

 

温馨提示: 本文最后更新于2026-07-22 12:43:57,某些文章具有时效性,若有错误或已失效,请在下方 留言或联系 Jv' Blog
© 版权声明
THE END
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容