在 Ubuntu 上使用 SFTP 进行备份
一 准备与连接方式
sudo apt-get install openssh-client。sftp username@remote_host,默认端口 22;也可在命令中指定端口:sftp -P 2222 username@remote_host。ls、cd、pwd 浏览远程;get 下载、put 上传;exit 退出。put -r / get -r。二 手动备份与恢复操作
sftp user@host,进入交互后执行 put -r /path/to/local/dir /remote/backup/。sftp user@host <<'EOF'
mkdir -p /remote/backup/2025-11-25
put -r /path/to/local/dir /remote/backup/2025-11-25
bye
EOF
get -r /remote/backup/2025-11-25 /path/to/restore/。sftp user@host <<'EOF'
get -r /remote/backup/2025-11-25 /path/to/restore/
bye
EOF
三 自动化备份脚本与定时任务
#!/usr/bin/env bash
set -Eeuo pipefail
LOCAL_DIR="/path/to/local/data"
REMOTE_USER="backupuser"
REMOTE_HOST="your.server.ip"
REMOTE_DIR="/remote/backup"
LOG="/var/log/sftp_backup.log"
TS=$(date +%F_%H-%M-%S)
mkdir -p "$LOCAL_DIR"
{
echo "[$TS] Start backup to $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR"
sftp "$REMOTE_USER@$REMOTE_HOST" <<EOF
mkdir -p "$REMOTE_DIR/$TS"
put -r "$LOCAL_DIR" "$REMOTE_DIR/$TS"
bye
EOF
echo "[$TS] Backup completed."
} >> "$LOG" 2>&1
chmod +x /usr/local/bin/sftp_backup.sh
crontab -e
# 每天 02:00 执行
0 2 * * * /usr/local/bin/sftp_backup.sh
# 本地 → 远程
0 2 * * * rsync -a -v -z --delete -e ssh /path/to/local/data/ backupuser@your.server.ip:/remote/backup/data/
# 远程 → 本地
0 3 * * * rsync -a -v -z --delete -e ssh backupuser@your.server.ip:/remote/backup/data/ /path/to/local/restore/
ssh-keygen -t rsa -b 4096 -C "backup@$(hostname)"
ssh-copy-id backupuser@your.server.ip
完成后即可在脚本与 cron 中无密码执行。四 作为 SFTP 服务器接收备份的配置要点
sudo apt update && sudo apt install openssh-server。sudo nano /etc/ssh/sshd_config
确保包含:Subsystem sftp internal-sftp
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
sudo groupadd sftpusers
sudo useradd -m -G sftpusers backupuser
sudo passwd backupuser
sudo chown root:root /home/backupuser
sudo chmod 755 /home/backupuser
# 备份数据目录放在子目录并赋权给该用户
sudo mkdir -p /home/backupuser/backup
sudo chown backupuser:backupuser /home/backupuser/backup
sudo systemctl restart sshd。sudo ufw allow 22/tcp。五 安全与可靠性建议
/etc/ssh/sshd_config 设置 PasswordAuthentication no 并重启 sshd)。tar czf 打包后再 put,以减小体积与传输时间。