Created
April 29, 2026 15:20
-
-
Save Chr0mium24/85c1ab4010b081d78c941dd25577fbf4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # ========================================================= | |
| # File Browser 安装管理向导(当前文件夹模式) | |
| # 功能: | |
| # 1. 安装(交互式) | |
| # 2. 查看状态 | |
| # 3. 卸载 | |
| # 4. 启动 / 停止 / 重启 | |
| # | |
| # 默认: | |
| # Port: 8899 | |
| # Address: 0.0.0.0 | |
| # Root Dir: /home | |
| # | |
| # 安装位置(当前文件夹): | |
| # Binary: ./filebrowser | |
| # Config: ./settings.json | |
| # Database: ./filebrowser.db | |
| # Service: /etc/systemd/system/filebrowser.service | |
| # ========================================================= | |
| set -e | |
| CUR_DIR="$(pwd)" | |
| APP="filebrowser" | |
| BIN_PATH="$CUR_DIR/filebrowser" | |
| CONFIG_DIR="$CUR_DIR" | |
| DB_PATH="$CUR_DIR/filebrowser.db" | |
| SETTINGS_PATH="$CUR_DIR/settings.json" | |
| SERVICE_PATH="/etc/systemd/system/filebrowser.service" | |
| DEFAULT_PORT="8899" | |
| DEFAULT_ADDR="0.0.0.0" | |
| DEFAULT_ROOT="/home" | |
| GREEN="\033[32m" | |
| RED="\033[31m" | |
| YELLOW="\033[33m" | |
| BLUE="\033[36m" | |
| RESET="\033[0m" | |
| info() { echo -e "${BLUE}[INFO]${RESET} $1"; } | |
| ok() { echo -e "${GREEN}[OK]${RESET} $1"; } | |
| warn() { echo -e "${YELLOW}[WARN]${RESET} $1"; } | |
| err() { echo -e "${RED}[ERROR]${RESET} $1"; } | |
| pause() { | |
| read -rp "按回车继续..." | |
| } | |
| require_root() { | |
| if [[ $EUID -ne 0 ]]; then | |
| err "请使用 root 或 sudo 运行" | |
| exit 1 | |
| fi | |
| } | |
| check_systemd() { | |
| if ! command -v systemctl >/dev/null 2>&1; then | |
| err "当前系统不支持 systemd" | |
| exit 1 | |
| fi | |
| } | |
| download_filebrowser() { | |
| info "下载 File Browser..." | |
| curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash | |
| if [[ ! -f "/usr/local/bin/filebrowser" ]]; then | |
| err "安装失败,未找到官方下载的二进制文件" | |
| exit 1 | |
| fi | |
| mv /usr/local/bin/filebrowser "$BIN_PATH" | |
| chmod +x "$BIN_PATH" | |
| ok "File Browser 已移动至当前目录:$BIN_PATH" | |
| } | |
| collect_install_config() { | |
| echo | |
| read -rp "监听地址 [默认: ${DEFAULT_ADDR}]: " FB_ADDR | |
| FB_ADDR=${FB_ADDR:-$DEFAULT_ADDR} | |
| read -rp "监听端口 [默认: ${DEFAULT_PORT}]: " FB_PORT | |
| FB_PORT=${FB_PORT:-$DEFAULT_PORT} | |
| while ! [[ "$FB_PORT" =~ ^[0-9]+$ ]]; do | |
| err "端口必须是数字" | |
| read -rp "监听端口 [默认: ${DEFAULT_PORT}]: " FB_PORT | |
| FB_PORT=${FB_PORT:-$DEFAULT_PORT} | |
| done | |
| read -rp "文件根目录 [默认: ${DEFAULT_ROOT}]: " FB_ROOT | |
| FB_ROOT=${FB_ROOT:-$DEFAULT_ROOT} | |
| if [[ ! -d "$FB_ROOT" ]]; then | |
| warn "目录不存在,自动创建:$FB_ROOT" | |
| mkdir -p "$FB_ROOT" | |
| fi | |
| } | |
| create_config() { | |
| mkdir -p "$CONFIG_DIR" | |
| cat > "$SETTINGS_PATH" <<EOF | |
| { | |
| "address": "${FB_ADDR}", | |
| "port": ${FB_PORT}, | |
| "baseURL": "", | |
| "log": "stdout", | |
| "database": "${DB_PATH}", | |
| "root": "${FB_ROOT}" | |
| } | |
| EOF | |
| ok "配置文件已生成:$SETTINGS_PATH" | |
| } | |
| create_service() { | |
| cat > "$SERVICE_PATH" <<EOF | |
| [Unit] | |
| Description=File Browser | |
| After=network.target | |
| [Service] | |
| Type=simple | |
| User=root | |
| ExecStart=${BIN_PATH} \\ | |
| -a ${FB_ADDR} \\ | |
| -p ${FB_PORT} \\ | |
| -r ${FB_ROOT} \\ | |
| -d ${DB_PATH} \\ | |
| -c ${SETTINGS_PATH} | |
| Restart=always | |
| RestartSec=3 | |
| [Install] | |
| WantedBy=multi-user.target | |
| EOF | |
| systemctl daemon-reload | |
| systemctl enable filebrowser | |
| systemctl restart filebrowser | |
| ok "systemd 服务已配置并启动" | |
| } | |
| install_app() { | |
| require_root | |
| check_systemd | |
| # 检查当前文件夹是否为空(忽略脚本自身) | |
| SCRIPT_NAME="$(basename "$0")" | |
| OTHER_FILES=$(ls -A1 | grep -v "^${SCRIPT_NAME}$" || true) | |
| if [[ -n "$OTHER_FILES" ]]; then | |
| warn "当前目录不为空,可能会与安装文件冲突。" | |
| warn "当前目录下的其它文件/文件夹:" | |
| echo "$OTHER_FILES" | |
| read -rp "是否无视警告并继续安装?(y/N): " IGNORE | |
| if [[ ! "$IGNORE" =~ ^[Yy]$ ]]; then | |
| info "已取消安装" | |
| return | |
| fi | |
| fi | |
| if [[ -f "$BIN_PATH" ]]; then | |
| warn "检测到已安装 File Browser(${BIN_PATH})" | |
| read -rp "是否覆盖安装?(y/N): " OVERWRITE | |
| if ! [[ "$OVERWRITE" =~ ^[Yy]$ ]]; then | |
| return | |
| fi | |
| fi | |
| collect_install_config | |
| download_filebrowser | |
| create_config | |
| create_service | |
| echo | |
| ok "安装完成" | |
| echo "访问地址: http://${FB_ADDR}:${FB_PORT}" | |
| echo "默认账号:admin" | |
| echo "默认密码:admin" | |
| warn "首次登录后请立即修改密码" | |
| } | |
| show_status() { | |
| if [[ ! -f "$SERVICE_PATH" ]]; then | |
| warn "File Browser 服务未安装(或不在当前目录管理)" | |
| return | |
| fi | |
| echo | |
| info "服务状态:" | |
| systemctl status filebrowser --no-pager || true | |
| echo | |
| info "监听端口:" | |
| ss -tulpn | grep filebrowser || true | |
| } | |
| start_service() { | |
| require_root | |
| systemctl start filebrowser | |
| ok "已启动" | |
| } | |
| stop_service() { | |
| require_root | |
| systemctl stop filebrowser | |
| ok "已停止" | |
| } | |
| restart_service() { | |
| require_root | |
| systemctl restart filebrowser | |
| ok "已重启" | |
| } | |
| uninstall_app() { | |
| require_root | |
| if [[ -f "$SERVICE_PATH" ]]; then | |
| systemctl stop filebrowser || true | |
| systemctl disable filebrowser || true | |
| rm -f "$SERVICE_PATH" | |
| systemctl daemon-reload | |
| ok "已移除 systemd 服务" | |
| fi | |
| remove_local_files() { | |
| rm -f "$BIN_PATH" "$SETTINGS_PATH" "$DB_PATH" | |
| ok "当前目录下的 File Browser 文件已删除" | |
| } | |
| read -rp "是否删除当前目录下的配置文件和数据库?(${SETTINGS_PATH}, ${DB_PATH}) (y/N): " REMOVE_CFG | |
| if [[ "$REMOVE_CFG" =~ ^[Yy]$ ]]; then | |
| remove_local_files | |
| else | |
| info "保留配置/数据库,仅移除二进制" | |
| rm -f "$BIN_PATH" | |
| fi | |
| ok "卸载完成" | |
| } | |
| show_menu() { | |
| clear | |
| echo "==================================================" | |
| echo " File Browser 安装管理向导" | |
| echo "==================================================" | |
| echo "1. 安装 File Browser(当前目录)" | |
| echo "2. 查看状态" | |
| echo "3. 启动服务" | |
| echo "4. 停止服务" | |
| echo "5. 重启服务" | |
| echo "6. 卸载 File Browser" | |
| echo "7. 退出" | |
| echo "==================================================" | |
| } | |
| main() { | |
| while true; do | |
| show_menu | |
| read -rp "请选择 [1-7]: " CHOICE | |
| case "$CHOICE" in | |
| 1) | |
| install_app | |
| pause | |
| ;; | |
| 2) | |
| show_status | |
| pause | |
| ;; | |
| 3) | |
| start_service | |
| pause | |
| ;; | |
| 4) | |
| stop_service | |
| pause | |
| ;; | |
| 5) | |
| restart_service | |
| pause | |
| ;; | |
| 6) | |
| uninstall_app | |
| pause | |
| ;; | |
| 7) | |
| exit 0 | |
| ;; | |
| *) | |
| err "无效选项" | |
| pause | |
| ;; | |
| esac | |
| done | |
| } | |
| main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment