在 Ubuntu 上实现 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
#!/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
四 定时执行与看护
[Unit]
Description=FTP Backup Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/ftp_backup.sh
User=root
StandardOutput=journal
StandardError=journal
[Unit]
Description=Daily FTP Backup Timer
Requires=ftp-backup.service
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
五 安全与维护建议