rdiff-backup远程备份实战:通过–remote-schema实现跨主机sudo权限备份


阅读 2 次

问题场景还原

最近在配置服务器自动化备份时,遇到一个典型需求:需要通过rdiff-backup工具备份远程主机的/etc目录,且远程主机需要sudo权限执行备份操作。本地测试命令如下:

rdiff-backup --remote-schema '%s' 'sudo /usr/bin/rdiff-backup --server \
    --restrict-read-only /'::/etc /var/backups/hosts/derp

这个命令在本地执行正常,但如何适配远程主机场景?

SSH通道建立

关键点在于--remote-schema参数需要结合SSH协议。以下是经过验证的远程备份方案:

rdiff-backup --remote-schema 'ssh -C %s sudo /usr/bin/rdiff-backup --server \
    --restrict-read-only /' root@remote-host::/etc /backup/local/path

权限配置要点

需要特别注意sudoers文件的配置,建议在远程主机添加:

# visudo
backup-user ALL=(root) NOPASSWD: /usr/bin/rdiff-backup --server *

完整实战案例

假设我们需要从192.168.1.100备份MySQL数据目录:

rdiff-backup --remote-schema 'ssh -i /path/to/key %s sudo /usr/local/bin/rdiff-backup --server \
    --restrict /var/lib/mysql' backup@192.168.1.100::/var/lib/mysql \
    /mnt/backup/mysql_data \
    --exclude '*/tmp' \
    --exclude '*/cache'

常见错误排查

  • 错误1sudo: no tty present and no askpass program specified

    解决方案:在sudoers文件添加Defaults:backup-user !requiretty
  • 错误2SSH connection rejected

    检查点:

    ssh -v -i /path/to/key backup@remote-host
    

自动化脚本示例

以下是通过shell脚本实现定时备份的完整示例:

#!/bin/bash
REMOTE_HOST="db-prod-1"
BACKUP_DIR="/backup/$(date +%Y%m%d)"
LOG_FILE="/var/log/rdiff-backup.log"

rdiff-backup --remote-schema "ssh -i /etc/backup.key %s sudo /usr/bin/rdiff-backup --server \
    --restrict-read-only /" \
    backup@${REMOTE_HOST}::/etc \
    ${BACKUP_DIR}/etc \
    2>&1 | tee -a ${LOG_FILE}

# 保留最近7天备份
rdiff-backup --force --remove-older-than 7D ${BACKUP_DIR}