Ubuntu FTP Server 自动备份方案
一 备份策略与准备
二 方案一 本机打包 + 定时上传到远程 FTP/FTPS(适合已有 FTP 服务)
#!/usr/bin/env bash
set -Eeuo pipefail
# 配置
FTP_HOST="ftp.example.com"
FTP_USER="backup"
FTP_PASS="YourStrongPass!"
FTP_REMOTE_DIR="/backups/ftpdata"
LOCAL_BACKUP_DIR="/backup/ftp"
DATE=$(date +%F_%H-%M-%S)
TAR_FILE="$LOCAL_BACKUP_DIR/ftpdata_$DATE.tar.gz"
LOG_FILE="/var/log/ftp_backup.log"
# 初始化
mkdir -p "$LOCAL_BACKUP_DIR"
exec >>"$LOG_FILE" 2>&1
# 1) 本地打包
echo "[$DATE] 开始打包 $FTP_REMOTE_DIR -> $TAR_FILE"
tar czf "$TAR_FILE" -C "$(dirname "$FTP_REMOTE_DIR")" "$(basename "$FTP_REMOTE_DIR")"
# 2) 增量上传到 FTP/FTPS(mirror 反向:本地->远程)
echo "[$DATE] 开始上传到 $FTP_HOST:$FTP_REMOTE_DIR"
lftp -e "
set ftp:ssl-force true;
set ftp:ssl-protect-data true;
open -u $FTP_USER,$FTP_PASS $FTP_HOST;
mirror --reverse --delete --verbose --parallel=4 --allow-newer '$LOCAL_BACKUP_DIR/' '$FTP_REMOTE_DIR/';
bye
"
# 3) 清理旧备份(保留最近7天)
find "$LOCAL_BACKUP_DIR" -name 'ftpdata_*.tar.gz' -mtime +7 -delete
echo "[$DATE] 完成,保留最近7天备份。"
三 方案二 从 FTP/FTPS 拉取数据到本机(适合无本机写权限或仅能被动拉取的场景)
#!/usr/bin/env bash
set -Eeuo pipefail
FTP_HOST="ftp.example.com"
FTP_USER="backup"
FTP_PASS="YourStrongPass!"
FTP_REMOTE_DIR="/data"
LOCAL_BACKUP_DIR="/backup/ftp_pull"
DATE=$(date +%F_%H-%M-%S)
LOG_FILE="/var/log/ftp_pull_backup.log"
mkdir -p "$LOCAL_BACKUP_DIR"
exec >>"$LOG_FILE" 2>&1
echo "[$DATE] 开始从 $FTP_HOST 拉取 $FTP_REMOTE_DIR -> $LOCAL_BACKUP_DIR"
lftp -e "
set ftp:ssl-force true;
set ftp:ssl-protect-data true;
open -u $FTP_USER,$FTP_PASS $FTP_HOST;
mirror --delete --verbose --parallel=4 --allow-newer '$FTP_REMOTE_DIR/' '$LOCAL_BACKUP_DIR/';
bye
"
# 可选:本地保留策略
find "$LOCAL_BACKUP_DIR" -mindepth 1 -mtime +7 -delete
echo "[$DATE] 拉取完成,保留最近7天。"
四 仅备份 FTP 服务器配置与用户数据(轻量且常备)
#!/usr/bin/env bash
set -Eeuo pipefail
DATE=$(date +%F)
OUT="/backup/vsftpd_conf_$DATE.tar.gz"
LOG="/var/log/vsftpd_backup.log"
exec >>"$LOG" 2>&1
echo "[$DATE] 备份 vsftpd 配置 -> $OUT"
tar czf "$OUT" -C /etc vsftpd /etc/vsftpd.* /etc/pam.d/vsftpd 2>/dev/null || true
chmod 600 "$OUT"
# 保留最近7天
find /backup -name 'vsftpd_conf_*.tar.gz' -mtime +7 -delete
echo "[$DATE] 完成。"
#!/usr/bin/env bash
set -Eeuo pipefail
DATE=$(date +%F)
OUT="/backup/ftp_data_$DATE.tar.gz"
LOG="/var/log/ftp_data_backup.log"
exec >>"$LOG" 2>&1
echo "[$DATE] 备份 FTP 数据 -> $OUT"
tar czf "$OUT" -C /var/ftp . 2>/dev/null || true
chmod 600 "$OUT"
find /backup -name 'ftp_data_*.tar.gz' -mtime +7 -delete
echo "[$DATE] 完成。"
五 安全加固与运维要点