SSH自动远程备份


16

我有两台机器,AB。机器A可以装入BA有很多可用空间。B的数据存在某种风险。 如何将所有B的数据A自动备份到。它不必非常频繁,但应免提。每次A启动都会足够频繁。我听说同步可以做到这一点。

Answers:


11

要在大多数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/.sshcron.daily


如果您使用公钥和每个用户cronjobs,则不一定。
Braiam 2014年

@Braiam,anacron不会为每位用户分配cron工作。尽管您始终可以使用su/ sudo从脚本中以特定用户身份运行rsync。但请注意,密钥将更安全地固定在/root
Graeme 2014年

1
如果您想使用带有root的cron作业和ssh,则更安全的是在authorized_keys文件中限制root可以在第二台计算机上执行的操作。
guido

1
@guido,不需要仅以root用户身份登录serverB即可以root用户身份登录serverB。@JennyD已经给出了有关在此处执行操作的建议,但是user取决于您要备份的内容,它可能只是machineB的普通用户。
Graeme'4

1
您的用户很可能对severB上的文件没有读取权限。在这种情况下,您需要使用拥有权限的用户,或者通过将当前用户添加到正确的组或更改文件的权限来授予当前用户正确的权限。如果您将所遇到的错误的样本和ls -l某些文件的输出添加到您的问题中,那么人们可以提供进一步的建议。
Graeme

5

我建议使用rdiff-backup。现在,我使用它每天晚上对自己的数据(两个工作站,两个服务器和其他人的服务器上的一个帐户)进行自动增量备份。

我为此使用了rsync,但由于它更加方便,因此切换到了rdiff-backup,它可以对大型文件(例如虚拟机磁盘映像)进行增量备份。rdiff-backup与我以前的rsync备份脚本非常相似,但是操作正确

我已经在存储备份的计算机上的/etc/cron.daily中放置了一个脚本文件,该文件每天清晨开始一次rdiff-backup,并从远程计算机中获取数据。


4

除了以前的所有答案之外,这是一个依赖于SSH密钥的方法,它限制了使用该密钥登录时可以执行的操作。

在服务器A上

在这一点上,创建一个单独的用户或使用您现有的用户名中的一个不那么重要,尽管如果是我,我将创建一个单独的用户。bkpuser在下面的示例中,我将为两个服务器使用用户名。

登录后bkpuser,创建不带密码的SSH密钥。

在服务器B上

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.....

在服务器A上

如果使用支持@reboot条目的cron选项卡之一,请使用bkpuser命令将此类条目添加到s crontab中ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz。如果不允许这些操作,请在您喜欢的任何时间进行设置-如果是我的数据,我可能每天都会做。


2

这是一个每天凌晨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上备份服务器的页面


1

您可以为此使用rsync(以一种相反的方式):

serverA# rsync -avz user@serverB:/path-to-backup.tar.gz /var/backup

哪里:

-avz  archive, compress and be verbose

我敢肯定-a暗示-r
Shadur 2014年

您完全正确
guido 2014年

-1

问题的关键是如何自动执行(无需输入密码):

  • 开始一个screentmux会话
  • 执行 eval $(ssh-agent)
  • 添加您的密钥 ssh-add
  • rsync的标志 export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • 每24小时备份一次 while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1表示无密码ssh
Graeme 2014年

所以我将所有这些都放在启动脚本中,对吗?
PyRulez 2014年

1
我认为这里开始了“真正重要的问题”,需要多少安全性?是否使用密码?这仅在以下情况下有效:1)从B中进行操作,挂起或休眠A。如果关闭A,则无效。如果您不使用密码,那么您将成为一种“危险情况”。

无需添加RSYNC_SSH以搜索SSH密钥的标准位置。
帕维尔Šimerda

1
我知道。您还监督了...可以添加有用参数的点。您也没有读完我最后提到“真正重要的问题”的评论,因此,我永远不会使用无密码密钥来做到这一点。您还需要启用,PubkeyAuthentication而没人说过。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.