#!/bin/bash # FRP Client 一键安装脚本 # 自动解压、配置和安装 frpc # 使用方法: chmod +x frpc.sh && ./frpc.sh # curl -sS -O https://gitea.tohub.top/Share/script/raw/branch/main/frpc.sh && chmod +x frpc.sh && ./frpc.sh # 彩色输出 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' NC='\033[0m' # No Color # 配置变量 INSTALL_DIR="/root/data/docker_data/frpc" BASE_URL="https://gitea.tohub.top/Share/script/raw/branch/main" FRPC_VERSION="0.65.0" set -e # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查是否为root用户 check_root() { if [[ $EUID -ne 0 ]]; then log_error "此脚本需要root权限运行" exit 1 fi } # 检查文件是否存在 check_files() { if [[ ! -f "frp_0.64.0_linux_amd64.tar.gz" ]]; then log_error "找不到 frp_0.64.0_linux_amd64.tar.gz 文件" exit 1 fi if [[ ! -f "frpc.toml" ]]; then log_error "找不到 frpc.toml 配置文件" exit 1 fi } # 创建frp用户 create_frp_user() { if ! id "frp" &>/dev/null; then log_info "创建 frp 用户..." useradd -r -s /bin/false frp else log_info "frp 用户已存在" fi } # 解压安装包 extract_archive() { log_info "解压 frp_0.64.0_linux_amd64.tar.gz..." # 创建临时目录 TEMP_DIR=$(mktemp -d) # 解压到临时目录 tar -xzf frp_0.64.0_linux_amd64.tar.gz -C "$TEMP_DIR" # 创建安装目录 mkdir -p /root/frpc # 复制文件 cp "$TEMP_DIR"/frp_0.64.0_linux_amd64/frpc /root/frpc/ # 清理临时目录 rm -rf "$TEMP_DIR" # 设置权限 - root目录需要特殊权限处理 chmod 755 /root # 确保frp用户可以访问root目录 chown -R root:frp /root/frpc chmod 750 /root/frpc chmod +x /root/frpc/frpc log_info "frpc 已安装到 /root/frpc/" } # 配置frpc configure_frpc() { log_info "配置 frpc..." # 复制配置文件 cp frpc.toml /root/frpc/ chown root:frp /root/frpc/frpc.toml chmod 640 /root/frpc/frpc.toml log_info "配置文件已复制到 /root/frpc/frpc.toml" } # 创建systemd服务 create_service() { log_info "创建 systemd 服务..." cat > /etc/systemd/system/frpc.service << 'EOF' [Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=frp Restart=on-failure RestartSec=5s ExecStart=/root/frpc/frpc -c /root/frpc/frpc.toml ExecReload=/bin/kill -s HUP $MAINPID KillMode=mixed TimeoutStopSec=5s [Install] WantedBy=multi-user.target EOF # 重新加载systemd systemctl daemon-reload log_info "systemd 服务已创建" } # 启动服务 start_service() { log_info "启动 frpc 服务..." # 启用开机自启 systemctl enable frpc # 启动服务 systemctl start frpc # 检查服务状态 if systemctl is-active --quiet frpc; then log_info "frpc 服务启动成功" else log_error "frpc 服务启动失败" log_error "请检查日志: journalctl -u frpc -f" exit 1 fi } # 显示状态信息 show_status() { log_info "安装完成!" echo "" echo "服务状态:" systemctl status frpc --no-pager echo "" echo "常用命令:" echo " 启动服务: systemctl start frpc" echo " 停止服务: systemctl stop frpc" echo " 重启服务: systemctl restart frpc" echo " 查看状态: systemctl status frpc" echo " 查看日志: journalctl -u frpc -f" echo "" echo "配置文件位置: /root/frpc/frpc.toml" echo "程序位置: /root/frpc/frpc" } # 交互式服务管理菜单 interactive_menu() { while true; do echo "" echo "===============================================" echo " FRP Client 服务管理" echo "===============================================" echo "1. 启动服务 (start)" echo "2. 停止服务 (stop)" echo "3. 重启服务 (restart)" echo "4. 查看状态 (status)" echo "5. 查看日志 (logs)" echo "6. 查看配置文件 (config)" echo "7. 编辑配置文件 (edit)" echo "8. 卸载服务 (uninstall)" echo "0. 退出 (exit)" echo "===============================================" read -p "请选择操作 [0-8]: " choice case $choice in 1|start) log_info "启动 frpc 服务..." systemctl start frpc if systemctl is-active --quiet frpc; then log_info "服务启动成功" else log_error "服务启动失败" fi systemctl status frpc --no-pager ;; 2|stop) log_info "停止 frpc 服务..." systemctl stop frpc log_info "服务已停止" ;; 3|restart) log_info "重启 frpc 服务..." systemctl restart frpc if systemctl is-active --quiet frpc; then log_info "服务重启成功" else log_error "服务重启失败" fi systemctl status frpc --no-pager ;; 4|status) echo "服务状态:" systemctl status frpc --no-pager ;; 5|logs) log_info "查看服务日志 (按 Ctrl+C 退出):" sleep 1 journalctl -u frpc -f ;; 6|config) echo "配置文件内容:" echo "----------------------------------------" cat /root/frpc/frpc.toml echo "----------------------------------------" ;; 7|edit) log_info "编辑配置文件..." if command -v nano >/dev/null 2>&1; then nano /root/frpc/frpc.toml elif command -v vi >/dev/null 2>&1; then vi /root/frpc/frpc.toml else log_error "未找到文本编辑器,请手动编辑: /root/frpc/frpc.toml" fi read -p "是否重启服务使配置生效? [y/N]: " restart_choice if [[ $restart_choice =~ ^[Yy]$ ]]; then systemctl restart frpc log_info "服务已重启" fi ;; 8|uninstall) read -p "确定要卸载 frpc 服务吗? [y/N]: " confirm if [[ $confirm =~ ^[Yy]$ ]]; then log_warn "正在卸载 frpc 服务..." systemctl stop frpc 2>/dev/null || true systemctl disable frpc 2>/dev/null || true rm -f /etc/systemd/system/frpc.service systemctl daemon-reload rm -rf /root/frpc userdel -r frp 2>/dev/null || true log_info "frpc 服务已完全卸载" exit 0 else log_info "取消卸载操作" fi ;; 0|exit|quit|q) log_info "退出管理界面" exit 0 ;; *) log_error "无效选择,请输入 0-8 或对应命令" ;; esac read -p "按回车键继续..." done } # 主函数 main() { # 检查是否为管理模式 if [[ "$1" == "manage" || "$1" == "menu" || "$1" == "-m" ]]; then interactive_menu return fi log_info "开始安装 FRP Client..." check_root check_files create_frp_user extract_archive configure_frpc create_service start_service show_status echo "" log_info "FRP Client 安装完成!" # 询问是否进入交互管理界面 read -p "是否进入交互式管理界面? [y/N]: " enter_menu if [[ $enter_menu =~ ^[Yy]$ ]]; then interactive_menu else echo "" log_info "可使用以下命令管理服务:" echo " ./install_frpc.sh manage # 进入交互管理界面" echo " systemctl [start|stop|restart|status] frpc" fi } # 运行主函数 main "$@"