在服务器上,最怕的就是:

  • 服务器崩了
  • 硬盘挂了
  • 网站文件没备份
  • 想恢复,发现啥都没有了……
  • 宝塔等备份莫名没备份上全备份自己服务器上,硬盘爆了

为了解决「​自己文件自己掌控​」的问题,我们写了一个纯 Bash 的 ​FTP 自动备份与管理脚本​,支持:

  • 多 FTP 账号
  • 多备份任务
  • 定时自动备份
  • 手动立即执行备份
  • 浏览远程 FTP 目录
  • 下载远程文件/目录到本地
  • 删除远程文件/目录
  • 一键卸载(连同配置 + crontab + 脚本本体)

📌 功能总览

功能 说明
多 FTP 账号 可以配置多个 FTP 账号,按需切换备份/管理
多备份任务 每个账号可绑定多个备份任务
定时备份 支持每天固定时间、每隔 N 分钟执行
立即执行 新建任务时可选择立即执行一次
远程浏览 在脚本中查看 FTP 远程目录结构
远程下载 可将远程文件/目录下载到指定本地目录(支持覆盖)
远程删除 删除远程文件或整个目录(带确认提示)
自动安装 支持 bash <(curl ...) 一键运行,自动保存脚本
自动卸载 一键清理配置、定时任务和脚本本体

兼容主流 Linux 发行版:Debian、Ubuntu、CentOS、AlmaLinux、Rocky 等,只要装得了 bash 和 lftp 基本都没问题。


⚡ 快速安装

在服务器上执行:

bash <(curl -L https://raw.githubusercontent.com/hiapb/ftp/main/back.sh)

脚本会自动:

  • 检查依赖(lftpcrontab 等)
  • 如果发现是通过 <(curl ...) 临时执行,会自动把当前脚本保存为:
    /root/back.sh
  • 赋予执行权限,并在后续 crontab 中统一使用 /root/back.sh

之后你可以通过:

bash /root/back.sh

随时重新进入管理菜单。


🧭 主菜单功能说明

启动脚本后,你会看到类似界面:

=======================================
🌐 FTP 备份工具(多账号版)
=======================================

🔐 FTP 账号:已配置 X 个 ✅

1) 📂 管理 FTP 账号
2) ➕ 新建备份任务
3) 📋 查看/立即执行备份任务
4) 🗑 删除备份任务
5) 🧹 卸载
0) ❎ 退出

说明:

  • 1)管理 FTP 账号​:新增账号 / 查看 / 删除 / 远程操作
  • 2)新建备份任务​:设置本地路径 → FTP 目录 → 定时方式
  • 3)查看/立即执行​:列出所有定时任务,并可手动执行一次
  • 4)删除备份任务​:从 crontab 中删除某条定时任务
  • 5)卸载​:删除所有配置、定时任务和 /root/back.sh 脚本本体
  • 0)退出​:退出脚本

注意:如果还没配置 FTP 账号,只能用 1 / 5 / 0,其它菜单会提醒你先添加账号。


🔐 FTP 账号管理

选择:

1) 📂 管理 FTP 账号

进入二级菜单:

=======================================
📂 FTP 账号管理
=======================================
当前账号数量:N

1) ➕ 新增 FTP 账号
2) 📋 查看 FTP 账号列表
3) 🗑 删除 FTP 账号
4) 🔍 使用账号浏览/下载/删除远程文件
0) ⬅ 返回主菜单

1️⃣ 新增 FTP 账号

选择 1

  • 账号名称(自定义别名,如 mainbackup1,内部用作配置文件名)
  • FTP 主机(如 ftp.example.com
  • FTP 端口(默认 21)
  • FTP 用户名
  • FTP 密码(明文输入,方便看清是否输错)

账号会保存为:

~/.ftp_backup_tool/accounts/账号名.conf

配置示例:

ACCOUNT_ID="main"
FTP_HOST="ftp.example.com"
FTP_PORT="21"
FTP_USER="myftpuser"
FTP_PASS="mypassword"

2️⃣ 查看 FTP 账号列表

选择 2

会列出所有账号,例如:

[1] 账号名:main  | 主机:ftp.example.com  | 用户:myftpuser
[2] 账号名:bbr   | 主机:ftp3.hostypanel.com  | 用户:xxx

3️⃣ 删除 FTP 账号(会清理其相关任务)

选择 3

  • 先列出账号列表
  • 输入编号确认
  • 再确认是否删除

被删除账号对应的所有备份任务(在 crontab 中带 # FTP_BACKUP[account_id] 标记)也会自动一并移除。

4️⃣ 使用账号浏览 / 下载 / 删除远程文件

选择 4

首先选择一个账号,然后进入远程操作菜单。


🌍 使用账号浏览 / 下载 / 删除远程文件

选定账号后,会看到:

=======================================
🔍 FTP 远程浏览 / 下载 / 删除
=======================================
当前账号:ACCOUNT_ID  (user@host:port)

1) 📁 列出某个远程目录内容
2) 📥 下载远程文件到本地
3) 📥 下载远程目录到本地
4) ❌ 删除远程文件
5) ⚠️ 删除远程目录
0) ⬅ 返回上一层

1️⃣ 列出某个远程目录内容

示例:

📂 请输入要查看的远程目录(例如 / 或 /backup/www): /
📋 / 下的内容:
────────────────────────────────
drwxr-xr-x   2 ftp ftp      33 Oct 27 22:07 board_email
drwxr-xr-x   4 ftp ftp      46 Nov 11 10:30 clodom
...
────────────────────────────────

脚本自动过滤掉 ... 两个无意义目录,只显示真实内容。

2️⃣ 下载远程文件到本地(支持覆盖)

比如想把 /test/index.php 下载到服务器 /root/downloads

  • 远程目录:/test
  • 文件名:index.php
  • 本地目录:/root/downloads

脚本流程:

  1. 自动 mkdir -p /root/downloads
  2. 使用 get 下载文件到本地,同名文件会被覆盖
  3. 下载前有确认提示

用途:

  • 快速从 FTP 同步配置文件到本地
  • 修改远程文件前,先拉一份本地备份
  • 从网站目录拉代码回来调试

3️⃣ 下载远程目录到本地

例如想把远程 /test 目录完整拉到本地 /root/test_bak

  • 远程目录:/test
  • 本地目录:/root/test_bak

使用 lftp mirror 命令:

  • 会同步远程目录里的所有文件/子目录到本地
  • 本地已有同名文件会根据 mirror 规则覆盖

适合:

  • 备份整站源码到服务器本地
  • 从 FTP 反向同步一份完整数据到 VPS 本地

4️⃣ 删除远程文件

  • 指定目录 + 文件名
  • 删除前会有 (y/N) 二次确认

例如:

  • 远程目录:/test
  • 文件名:old.log

最终删除 /test/old.log

5️⃣ 删除远程目录(整目录)

  • 指定目录,如 /test
  • 操作前会有警告提示
  • 使用 rm -r 递归删除

只会删除你指定的这个目录,不会去模糊匹配所有叫 test 的路径。


💾 新建备份任务(本地 → FTP)

回到主菜单选择:

2) ➕ 新建备份任务

流程如下:

  1. 输入本地路径(文件或目录)

    • 如果不存在,会反复提示重新输入
    • 不允许路径中带空格(避免转义问题)
  2. 输入 FTP 目标目录,例如:

    • /backup/www
    • /site_bak
    • test(会当作相对路径)
  3. 选择 FTP 账号(会列出账号给你选编号)
  4. 选择定时方式:

    • 1) 每天固定时间备份
      • 输入小时(0–23)和分钟(0–59)
      • 内部会写入 crontab 形如:M H * * * ...
    • 2) 每隔 N 分钟备份
      • 输入 N(1–59)
      • 内部写入:*/N * * * * ...
  5. 确认后,脚本会生成 crontab 定时任务,并显示完整行内容。
  6. 最后会询问:

    ⚡ 是否立即执行一次此备份任务?(Y/n):

    默认回车为 Y,会立刻执行一次备份。

备份逻辑简述

  • 如果本地是目录:
    使用 lftp mirror -R 递归上传目录结构:
    mirror -R "本地目录" "远程目录"
  • 如果本地是文件:
    使用 put 上传单文件到远程目录:
    put "本地文件" -o "远程文件名"

⏰ 查看 / 立即执行备份任务

主菜单:

3) 📋 查看/立即执行备份任务

功能:

  • 从 crontab 中过滤出所有带 # FTP_BACKUP[...] 标记的行
  • 按编号展示
  • 可选择其中一个任务立即执行一次(不改动其定时设置)

适合:

  • 新改了本地文件,想马上推送一次
  • 排查任务是否配置正确

🗑 删除备份任务

主菜单:

4) 🗑 删除备份任务

步骤:

  1. 列出所有备份任务(crontab 中的对应行)
  2. 输入任务编号
  3. 该行会从 crontab 中删除

不会影响 FTP 账号配置。


🧹 卸载工具(含脚本本体)

主菜单:

5) 🧹 卸载

功能:

  • 删除所有包含 # FTP_BACKUP 的定时任务
  • 删除配置目录:~/.ftp_backup_tool/
  • 删除脚本本体:/root/back.sh(或实际安装路径 SCRIPT_PATH
  • 输出提示后自动 exit 0

也就是说,卸载后系统上不再残留任何相关文件,想重装就再运行一次:

bash <(curl -L https://raw.githubusercontent.com/hiapb/ftp/main/back.sh)

✅ 使用建议与小技巧

  • 建议本地备份目录路径尽量简单,例如:
    /root/agent.sh/root/site/data/wwwroot
  • 由于目前不支持路径中带空格,如有需要可以先创建软链接:
    ln -s "/path/with space" /root/path_nospace
  • 建议不同的 FTP 用途配不同账号,例如:
    • web_backup:网站源码备份
    • db_backup:数据库定时导出后备份
    • config_backup:配置文件
  • 可以配合 crontab 把数据库先导出到本地,再由脚本上传到 FTP,例如:
    • 定时 mysqldump 输出到 /root/db_bak/db.sql
    • 再由本脚本把 /root/db_bak 上传到 FTP

🎉 总结

通过这个脚本,你可以非常方便地做到:

  • 本地 → FTP 自动备份(支持多任务、多账号)
  • FTP → 本地 下载文件 / 整个目录(镜像)
  • 在终端就能浏览和清理 FTP 目录
  • 安装简单,卸载干净利落

算是一个「能自己养活自己」的小型备份 & 管理系统,非常适合:

  • 个人 VPS 用户
  • 小站长 / 博客主
  • 习惯 FTP 同步的网站环境

希望这个脚本可以慢慢养成你的「全家桶备份管理工具」。