SSH автоматическое резервное копирование

16

У меня есть две машины, Aи B. Машина Aможет сш в B. Aимеет много свободного места. BДанные в какой-то рискованной ситуации. Как сделать резервное копирование всех Bданных в Aавтоматически. Это не должно быть ужасно частым, но это должно быть свободные руки. Каждый раз, когда Aзагружается будет достаточно часто. Я слышал, синхронизация может сделать это.

PyRulez
источник

Ответы:

11

Чтобы делать это ежедневно в большинстве дистрибутивов Linux, вы должны просто поместить rsyncкоманду (согласно ответу @ guido ) в скрипт и поместить скрипт в /etc/cron.dailyкаталог. Пока anacronон установлен (может не быть по умолчанию), все пропущенные cron.dailyзадания будут обнаружены при следующей загрузке машины (а также при запуске в полночь, если машина переключена).

Для сценария вы просто сделаете:

#!/bin/sh
rsync -a user@serverB:/source/folder/ /destination_folder

Вы можете добавить -zопцию (сжатие), если резервное копирование выполняется по медленному (ish) соединению или если вы хотите сэкономить пропускную способность, но по моему опыту это на самом деле снизит производительность на современных машинах / сетях.

Если вы хотите вести журнал каждой резервной копии, вы можете сделать что-то вроде:

#!/bin/sh
rsync -av user@serverB:/source/folder/ /destination_folder \
  >/var/log/backup_log 2>&1

Обратите внимание, что для того, чтобы это работало как задание cron, у вас должен быть установлен ssh без пароля для root на сервере A для входа на сервер B. Это должна быть учетная запись root (т. Е. Ключи /root/.ssh), так как cron.dailyзадания запускаются от имени root.

Graeme
источник
Не обязательно, если вы используете открытый ключ и для каждого пользователя cronjobs.
Брайам
@Braiam, anacronне будет забирать на cronработу пользователя . Хотя вы всегда можете использовать su/ sudoиз скрипта для запуска rsync от имени конкретного пользователя. Но учтите, что ключи будут надежнее удерживаться /root.
Грэм
1
если вы хотите использовать задание cron и ssh с root, гораздо безопаснее ограничить действия root на втором компьютере в файле authorized_keys.
Гидо
1
@ Guido, нет необходимости входить в систему как root на сервере B только потому, что вы root на сервере A. @JennyD уже дал предложение о том, что здесь делать, но userможет быть обычным пользователем на machineB, в зависимости от того, что вы копируете .
Грэм
1
Скорее всего, у вашего пользователя нет прав на чтение файлов на сервере severB. Если это так, либо вам нужно использовать пользователя, который дает или дает текущему пользователю правильные разрешения, либо добавив его в правильные группы, либо изменив разрешения для файлов. Если ls -lк вашему вопросу вы добавите образец ошибок, которые вы получаете, и вывод некоторых файлов, то люди могут дать дальнейшие советы.
Грэм
5

Я бы предложил использовать rdiff-backup . Я использую его сейчас для автоматического создания инкрементных резервных копий каждую ночь для моих собственных данных (две рабочие станции, два сервера и одна учетная запись на чужом сервере).

Ранее я использовал для этого rsync, но переключился на rdiff-backup, так как это более удобно и может создавать инкрементные резервные копии больших файлов, таких как образы дисков виртуальных машин. rdiff-backup во многом похож на мои предыдущие скрипты rsync, но все сделано правильно .

Я поместил файл сценария в /etc/cron.daily на компьютер, на котором хранится резервная копия, который запускает rdiff-backup один раз в день рано утром и получает данные с удаленного компьютера.

Томас Падрон-Маккарти
источник
4

В дополнение ко всем предыдущим ответам, вот тот, который полагается на ключи SSH с ограничениями на то, что может быть сделано при входе в систему с этим ключом.

На сервере А

В этом случае менее важно, если вы создаете отдельного пользователя или используете одно из существующих имен пользователей, хотя на моем месте я бы создал отдельного пользователя. Я буду использовать имя пользователя bkpuserдля обоих серверов в моих примерах ниже.

После входа в систему bkpuserсоздайте ключ SSH без пароля.

На сервере Б

Включить PubkeyAuthenticationв sshd_config.

Создайте пользователя bkpuser. Установите очень сложный пароль или отключите вход с паролем для этого пользователя (как именно вы это сделаете, будет зависеть от того, какой Unix и дистрибутив вы используете) Дело в том, что пользователь должен войти в систему только с ключом SSH. Убедитесь, что у вас bkpuserесть доступ на чтение ко всем каталогам и файлам, которые вы хотите сохранить.

Скопируйте открытую часть ключа, созданного на A, ~bkpuser/.ssh/authorized_keysна B. Отредактируйте, чтобы автоматически запускать команду для соединения. Эта команда не должна быть указателем на скрипт оболочки; вместо этого вставьте скрипт оболочки непосредственно в ключ. Также включите ограничение, чтобы ключ можно было использовать только с сервера А, а не с другого сервера. В приведенном ниже примере я даю серверу 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.....

На сервере А

Если вы используете одну из вкладок cron, которая поддерживает @rebootзаписи, добавьте такую ​​запись в bkpusers crontab с помощью команды ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Если это не разрешено, установите его в любое удобное время - если бы это были мои данные, я бы, наверное, делал это ежедневно.

Дженни Д
источник
2

Вот полное решение для резервного копирования сервера B на сервер A каждый день в 4 часа утра по SSH.

Создайте автоматическое соединение SSH с сервера B на сервер A

ssh-keygen -t dsa -b 1024
ssh-copy-id -i ~/.ssh/id_dsa.pub "-p ssh_port root@server_a"

Создайте скрипт резервного копирования на сервере B

nano / root / backup

# !/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 / backup

Автоматизировать резервное копирование на сервере B

crontab -e

0 4 * * * /root/backup > /dev/null

Для получения дополнительной информации см. Стр. Подключение к SSH без ввода пароля в Linux и резервное копирование сервера в 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.
Шадур
Вы абсолютно правы
Гвидо,
-1

Суть вопроса в том, как сделать это автоматически (не нужно вводить пароли):

  • начать screenили tmuxсеанс
  • выполнять 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.
Грэм
Так что я бы поставил все это в сценарий запуска, верно?
PyRulez
1
Я думаю, что здесь начинается «действительно важный вопрос», сколько безопасности необходимо? Делать это с паролями или без? Это будет работать, только если вы: 1) сделаете это из B, приостановите или переведете в спящий режим A. Это не будет работать, если вы выключите A. Если вы обойдетесь без паролей, тогда вы станете своего рода «рискованной ситуацией».
Нет необходимости добавлять RSYNC_SSHк поиску стандартные местоположения ключей SSH.
Павел Шимерда
1
Я знаю это. Вы также наблюдали за ...точками, в которые можно добавлять полезные аргументы. Вы также не читали мой последний комментарий, где я упоминаю «действительно важный вопрос», поэтому я никогда не делал бы это с ключами без пароля. Вы также должны будете включить, PubkeyAuthenticationи никто не сказал это.