使用 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 用户无权限使用 sudosu

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

验证与自查

  1. 手动执行 bash /root/backup.sh 无报错,且 rclone lsf us-bwg:/opt/backup/us-phx 能看到 opt-时间戳.tar.gz 文件
  2. crontab -l 能看到定时任务,date 确认任务时间正确
  3. 远程目录中旧备份被轮换删除,始终只保留最新 3 份
  4. 抽查远程备份包完整性:tar -tzf 或解压后与源目录对比

参考