Skip to content

Instantly share code, notes, and snippets.

@Chr0mium24
Created April 29, 2026 15:20
Show Gist options
  • Select an option

  • Save Chr0mium24/85c1ab4010b081d78c941dd25577fbf4 to your computer and use it in GitHub Desktop.

Select an option

Save Chr0mium24/85c1ab4010b081d78c941dd25577fbf4 to your computer and use it in GitHub Desktop.
#!/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