温馨提示×

如何在Ubuntu上实现FTP服务器自动备份

小樊
35
2025-12-03 11:11:12
栏目: 云计算

在 Ubuntu 上实现 FTP 服务器自动备份

一 方案总览

  • 备份方向通常有两种:
    • 从 FTP 服务器拉取数据到本地归档(推荐用 lftp mirror 做增量同步)。
    • 将本地生成的备份文件推送到 FTP 服务器(可用 lftp putftp 客户端)。
  • 定时执行采用 cron;如需看护与自启,可配合 systemd 服务与定时器。
  • 若环境允许,优先使用 SFTP/FTPS 替代明文 FTP,以提升安全性。

二 准备与前提

  • 安装必要工具:建议安装 lftp(稳定、支持镜像与 FTPS),以及 vsftpd 作为示例 FTP 服务(如尚未安装)。
    • sudo apt update && sudo apt install -y lftp vsftpd
  • 规划目录与权限:
    • 本地备份目录:如 /backup,确保有充足空间与正确属主。
    • 日志目录与权限:如 /var/log/ftp_backup.log,建议属主 root:adm、权限 660,便于审计。
  • 基本 FTP 连通性验证(示例):
    • lftp -u 用户名,密码 -e “ls; quit” ftp://服务器地址

三 备份脚本示例

  • 示例 A 从 FTP 拉取目录到本地(增量镜像,适合定期全量备份)
#!/usr/bin/env bash
set -Eeuo pipefail

# 配置
HOST="ftp.example.com"
USER="ftpuser"
PASS="ftppass"
REMOTE_DIR="/data"
LOCAL_DIR="/backup/ftp_data"
LOG_FILE="/var/log/ftp_backup.log"

# 初始化
mkdir -p "$LOCAL_DIR"
exec >>"$LOG_FILE" 2>&1
echo "=== $(date '+%F %T') 开始备份 ==="

# 使用 lftp 镜像:--reverse 表示本地→远端为“反向”镜像(拉取),--delete 同步删除,--parallel 并发
lftp -u "$USER,$PASS" "$HOST" <<'EOF'
set ftp:ssl-allow no
mirror --reverse --delete --verbose --parallel=4 --allow-newer \
      --exclude-glob "*.tmp" --exclude-glob "*.log" \
      "$REMOTE_DIR" "$LOCAL_DIR"
quit
EOF

if (( $? == 0 )); then
  echo "$(date '+%F %T') 备份完成:$LOCAL_DIR"
else
  echo "$(date '+%F %T') 备份失败,请检查日志:$LOG_FILE"
  exit 1
fi
  • 示例 B 将本地备份文件推送到 FTP(适合先本地打包再上传)
#!/usr/bin/env bash
set -Eeuo pipefail

FTP_HOST="ftp.example.com"
FTP_USER="ftpuser"
FTP_PASS="ftppass"
FTP_DIR="/backup_remote"
LOCAL_FILE="/backup/ftp_data_$(date +%F_%H%M%S).tar.gz"
LOG_FILE="/var/log/ftp_backup.log"

mkdir -p "$(dirname "$LOCAL_FILE")"
exec >>"$LOG_FILE" 2>&1
echo "=== $(date '+%F %T') 开始上传 ==="

# 先本地打包(示例:备份 /home/ftpuser 目录)
tar czf "$LOCAL_FILE" -C /home/ftpuser .

# 上传到 FTP
lftp -u "$FTP_USER,$PASS" "$FTP_HOST" <<EOF
cd "$FTP_DIR"
put "$LOCAL_FILE"
quit
EOF

if (( $? == 0 )); then
  echo "$(date '+%F %T') 上传完成:$LOCAL_FILE -> $FTP_DIR"
else
  echo "$(date '+%F %T') 上传失败"
  exit 1
fi
  • 赋权与校验:
    • chmod +x /usr/local/bin/ftp_backup.sh
    • 手动执行一次以验证:/usr/local/bin/ftp_backup.sh

四 定时执行与看护

  • 使用 cron 定时(示例:每天 02:00 执行)
    • 编辑当前用户计划任务:crontab -e
    • 添加:0 2 * * * /usr/local/bin/ftp_backup.sh
    • 如需系统级任务,可编辑 /etc/crontab(注意字段中包含用户列)。
  • 日志与审计:
    • 查看 cron 执行记录:sudo tail -f /var/log/cron.log(如未启用,可在 /etc/rsyslog.d/50-default.conf 中取消注释 cron. /var/log/cron.log* 并重启 rsyslog)。
  • 可选 systemd 看护(示例)
    • 创建服务:/etc/systemd/system/ftp-backup.service
      [Unit]
      Description=FTP Backup Service
      After=network.target
      
      [Service]
      Type=oneshot
      ExecStart=/usr/local/bin/ftp_backup.sh
      User=root
      StandardOutput=journal
      StandardError=journal
      
    • 创建定时器:/etc/systemd/system/ftp-backup.timer
      [Unit]
      Description=Daily FTP Backup Timer
      Requires=ftp-backup.service
      
      [Timer]
      OnCalendar=daily
      Persistent=true
      
      [Install]
      WantedBy=timers.target
      
    • 启用:sudo systemctl daemon-reload && sudo systemctl enable --now ftp-backup.timer
    • 查看状态:systemctl list-timers

五 安全与维护建议

  • 凭据安全:避免在脚本中明文写密码,优先使用 ~/.netrc(权限 600)、lftp 的 ~/.lftprc,或改用 SFTP/密钥认证;必要时为 FTP 启用 TLS/SSL(FTPS)
  • 保留策略:定期清理旧备份(示例:保留最近 7 天)
    • 在脚本尾部加入:find /backup -name “backup_*.tar.gz” -mtime +7 -delete
  • 校验与恢复演练:定期校验备份完整性与可恢复性(如抽样解压、校验和),并进行恢复演练。
  • 传输稳定性:在 lftp mirror 中使用 –parallel–allow-newer、以及合理的 –exclude-glob 提升效率与一致性。

0