使用 rclone 自动备份 Linux 服务器重要数据
本文适合需要把服务器关键目录定期备份到远程服务器的运维人员。你会学到:创建受限备份用户(禁 sudo/su)、配置 SSH 公钥认证、安装配置 rclone 的 sftp 远程,并用脚本 + crontab 定时备份 /etc、/var/www、/opt,远程只保留最近 3 份。
本文介绍如何在 Linux 服务器上创建一个受限的备份用户,并使用 rclone 工具定期将 /etc、/var/www 和 /opt 三个目录备份至远程服务器。内容涵盖用户权限控制、SSH 公钥登录、rclone 配置及定时任务设置。
一、目标服务器创建受限的 rclone-backup 用户
1. 创建用户
sudo adduser rclone-backup
按提示设置密码,其他信息可留空。
2. 禁用 sudo 权限
将该用户从 sudo 组中移除,避免其获得 root 权限:
sudo deluser rclone-backup sudo
3. 禁用 su 权限
编辑 PAM 配置文件,限制用户使用 su 命令:
sudo nano /etc/pam.d/su
找到以下行并取消注释(或添加):
auth required pam_wheel.so use_uid
然后编辑 /etc/group 文件,确保 rclone-backup 不属于 wheel 组。
4. 测试与验证
执行以下命令,确认 rclone-backup 用户无权限使用 sudo 和 su:
sudo -u rclone-backup sudo -i
sudo -u rclone-backup su
如果输出为"权限被拒绝"或类似信息,则权限设置成功。
5. 创建备份文件夹
mkdir /opt/backup
chown -R rclone-backup:rclone-backup /opt/backup
chmod -R 755 /opt/backup
二、目标服务器配置 SSH 登录(公钥认证)
1. 配置目标服务器上的公钥
mkdir -p /home/rclone-backup/.ssh
nano /home/rclone-backup/.ssh/authorized_keys
粘贴你的公钥:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGjFShLsR9+8ksNfNli76sxbLRxw4TKKLdgH7J/9xz8h
2. 设置权限(必须)
chmod 755 /home/rclone-backup
chmod 700 /home/rclone-backup/.ssh
chmod 600 /home/rclone-backup/.ssh/authorized_keys
chown -R rclone-backup:rclone-backup /home/rclone-backup/.ssh
三、源服务器配置 SSH 私钥
nano /root/.ssh/rclone-backup.key
将私钥粘贴进去后,openssh 出于安全限制,要求私钥权限为600:
chmod 600 /root/.ssh/rclone-backup.key
四、源服务器安装并配置 rclone
1. 安装 rclone
wget https://downloads.rclone.org/v1.69.2/rclone-v1.69.2-linux-amd64.deb
dpkg -i rclone-v1.69.2-linux-amd64.deb
2. 配置 rclone 远程连接
编辑配置文件:
mkdir -p /root/.config/rclone
nano /root/.config/rclone/rclone.conf
示例配置(两个远程服务器):
[us-bwg]
type = sftp
host = xx.x.x.x
port = 5020
user = rclone-backup
key_file = /root/.ssh/rclone-backup.key
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum
[us-dmit]
type = sftp
host = x.x.x.x
port = 5020
user = rclone-backup
key_file = /root/.ssh/rclone-backup.key
shell_type = unix
md5sum_command = md5sum
sha1sum_command = sha1sum
五、编写定时备份脚本
创建备份脚本:
nano /root/backup.sh
脚本内容如下:
#!/bin/bash
# 步骤 1:准备备份目录
mkdir -p /opt/backcup
mkdir -p /home/backup/
mkdir -p /opt/backcup/var/www/
rsync -aq --delete /etc/ /opt/backcup/etc/
rsync -aq --delete /var/www/ /opt/backcup/var/www/
# 步骤 2:打包 /opt 目录
timestamp=$(date +"%Y%m%d%H%M%S")
backup_file="/home/backup/opt-${timestamp}.tar.gz"
tar -czvf "$backup_file" /opt
# 步骤 3:同步至远程并保留最新 3 个备份
remotes=("us-bwg:/opt/backup/us-phx" "us-dmit:/opt/backup/us-phx")
for remote in "${remotes[@]}"; do
# 上传备份文件
remote_file=()
rclone copy "$backup_file" "$remote" -L -u -v -P \
--transfers=20 --ignore-errors --buffer-size=128M \
--check-first --checkers=10 --drive-acknowledge-abuse
# 获取远程文件列表
mapfile -t remote_files < <(rclone lsf "$remote" | grep 'opt-' | sort -r)
# 删除旧备份,只保留最新 3 个
if [ ${#remote_files[@]} -gt 3 ]; then
for ((i=3; i<${#remote_files[@]}; i++)); do
echo "删除旧备份:${remote_files[$i]}"
rclone delete "$remote/${remote_files[$i]}"
done
fi
done
# 步骤 4:可选 - 删除本地打包文件
rm -f "$backup_file"
给予执行权限:
chmod +x /root/backup.sh
六、设置定时任务(crontab)
执行以下命令:
crontab -e
添加以下内容,每周一凌晨 2 点执行:
0 2 * * 1 /root/backup.sh >> /var/log/backup.sh.log 2>&1
验证与自查
- 手动执行
bash /root/backup.sh无报错,且rclone lsf us-bwg:/opt/backup/us-phx能看到opt-时间戳.tar.gz文件 crontab -l能看到定时任务,date确认任务时间正确- 远程目录中旧备份被轮换删除,始终只保留最新 3 份
- 抽查远程备份包完整性:
tar -tzf或解压后与源目录对比