Answers:
要在大多数Linux发行版中每天执行此操作,您应该只需将rsync
命令(按照@guido的答案)放入脚本中并将脚本放入/etc/cron.daily
目录中即可。只要anacron
已安装(默认情况下可能不是默认设置),所有丢失的cron.daily
作业都将在下次启动计算机时(以及在切换计算机时在午夜运行)被捕获。
对于脚本,您只需执行以下操作:
#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder
-z
如果备份是通过较慢的连接进行的,或者您想节省带宽,则可以添加(压缩)选项,但是根据我的经验,这实际上会损害现代计算机/网络的性能。
如果要保留每个备份的日志,可以执行以下操作:
#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
>/var/log/backup_log 2>&1
请注意,要使其成为cron作业,必须在serverA 上为root设置无密码ssh才能登录到serverB。由于作业以root身份运行,因此它必须是root帐户(即)。/root/.ssh
cron.daily
anacron
不会为每位用户分配cron
工作。尽管您始终可以使用su
/ sudo
从脚本中以特定用户身份运行rsync。但请注意,密钥将更安全地固定在/root
。
ls -l
某些文件的输出添加到您的问题中,那么人们可以提供进一步的建议。
我建议使用rdiff-backup。现在,我使用它每天晚上对自己的数据(两个工作站,两个服务器和其他人的服务器上的一个帐户)进行自动增量备份。
我为此使用了rsync,但由于它更加方便,因此切换到了rdiff-backup,它可以对大型文件(例如虚拟机磁盘映像)进行增量备份。rdiff-backup与我以前的rsync备份脚本非常相似,但是操作正确。
我已经在存储备份的计算机上的/etc/cron.daily中放置了一个脚本文件,该文件每天清晨开始一次rdiff-backup,并从远程计算机中获取数据。
除了以前的所有答案之外,这是一个依赖于SSH密钥的方法,它限制了使用该密钥登录时可以执行的操作。
在这一点上,创建一个单独的用户或使用您现有的用户名中的一个不那么重要,尽管如果是我,我将创建一个单独的用户。bkpuser
在下面的示例中,我将为两个服务器使用用户名。
登录后bkpuser
,创建不带密码的SSH密钥。
PubkeyAuthentication
在中启用sshd_config
。
创建用户bkpuser
。设置一个非常复杂的密码,或为该用户禁用密码登录(确切的操作方式取决于您正在运行的UNIX和发行版)。关键是用户只能使用SSH密钥登录。确保对bkpuser
您要备份的所有目录和文件具有读取权限。
将在A ~bkpuser/.ssh/authorized_keys
上创建的密钥的公共部分复制到B上。编辑,以自动在连接上运行命令。该命令不应是指向shell脚本的指针;而是直接将Shell脚本插入键中。还包括一个限制,以便只能从服务器A使用该密钥,而不能从其他服务器使用该密钥。在下面的示例中,我为服务器A提供了IP地址,10.1.2.3
并假设我要备份的文件都在之下/data
。
from="10.1.2.3",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="cd /data;/usr/bin/tar -cf - *; /usr/bin/logger -t BACKUP -p daemon.info \"INFO: Backup-files on $HOST fetched from ${SSH_CLIENT%% *} by $USER\";" ssh-dss AA.....
如果使用支持@reboot
条目的cron选项卡之一,请使用bkpuser
命令将此类条目添加到s crontab中ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz
。如果不允许这些操作,请在您喜欢的任何时间进行设置-如果是我的数据,我可能每天都会做。
这是一个每天凌晨4点使用SSH将服务器B备份到服务器A的完整解决方案。
创建从服务器B到服务器A的自动SSH连接
ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"
在服务器B上创建备份脚本
纳米/ root /备份
# !/bin/sh
# Variables loading
HOST="root@server_a"
PORT=22
DIR="/var/backups/server_b"
# Directories creating
ssh -p $PORT $HOST <<EOF
mkdir -p $DIR/home
logout
EOF
# Files backing up
rsync -aze "ssh -p $PORT" --delete /home/user $HOST:$DIR/home
chmod 744 / root /备份
在服务器B上自动备份
crontab -e
0 4 * * * /root/backup > /dev/null
有关更多详细信息,请参见在Linux上无需输入密码即可连接到SSH的页面,以及在Debian或Ubuntu Linux上备份服务器的页面。
您可以为此使用rsync(以一种相反的方式):
serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup
哪里:
-avz archive, compress and be verbose
-a
暗示-r
。
问题的关键是如何自动执行(无需输入密码):
screen
或tmux
会话eval $(ssh-agent)
ssh-add
export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done
ssh
。
RSYNC_SSH
以搜索SSH密钥的标准位置。