问题场景还原
最近在配置服务器自动化备份时,遇到一个典型需求:需要通过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'
常见错误排查
- 错误1:
sudo: no tty present and no askpass program specified
解决方案:在sudoers文件添加Defaults:backup-user !requiretty
- 错误2:
SSH 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}