Pull to refresh

Создание бекапов удаленно используя ssh, scp, tcl. Несколько способов

Reading time 3 min
Views 7.2K
Бекапы — вещь необходимая. Особенно понимаешь это тогда, когда срабатывает закон подлости и несмотря на многие моменты предосторожности, теряется информация, на восстановление которой может понадобиться много времени, если нет резервных копий.
Это статья в первую очередь для программистов, но возможно и администраторы почерпнут некую полезную информацию для себя.
Задача стоит в том что у нас есть один или несколько серверов, на котором есть часто обновляющаяся информация. Эту информацию нужно периодически бекапить на каком то одном «главном» сервере. Для этого мы напишем скрипт, который поместим на главном сервере, который будет автоматически коннектиться к каждому серверу создавать там бекапы, архивировать их и копировать архивы бекапов на главный сервер используя протокол безопасного копирования файлов SCP.
И так перейдем к нашим скриптам.

Первый метод


Это баш(shell) скрипт — использует принцип удаленного беспарольного входа по ключу, используя SSH(через ssh-id). Как настроить такое соединение вы можете почитать в этой статейке

Наш первый скрипт:

#!/bin/bash

DST_IPADDR=91.214.132.14
DST_LOGIN=root

BACKUPDIRS="/home/test1 /home/test2"
TMPDIR="/home/"
timestamp=`date "+%Y_%m_%d"`

err() { echo -e "* Error: $1"; exit 1; }

ssh $DST_LOGIN@$DST_IPADDR 'tar -zcvf '$TMPDIR$DST_IPADDR'_'$timestamp'.tar.gz '$BACKUPDIRS || err "Remote connection failed"
scp $DST_LOGIN@$DST_IPADDR:${TMPDIR}${DST_IPADDR}_${timestamp}.tar.gz ./
ssh $DST_LOGIN@$DST_IPADDR 'rm -f '$TMPDIR$DST_IPADDR'_'$timestamp'.tar.gz' || err "Remote connection failed"


Этот скрипт коннектится по ssh к удаленному серверу, создает бекап, переписывает его на главный сервер и далее — удаляет созданный бекап на удаленном сервере.

Второй метод


Работает по такому принципу — удаленного коннекта к серверу используя язык TCL.
Его можно использовать тогда когда по каким то причинам нет возможности создать беспарольный вход(по ключу) используя SSH.
Тут уже требуются данные входа не только для удаленного сервера, но и для главного сервера, для последующего копирования бекапа на главный сервер

Наш второй скрипт:

#!/usr/bin/expect -f
set timeout 100
set SELFPASS "mypassword"
set SELFUSER "root"
set SELFIP "91.214.132.13"
set SELFDIR "/home/backup5"

set PASS "remotepassword"
set USER "root"
set IPSERV "91.214.132.14"
set BackupDirectories "/home/test1 /home/test2"
set TMPDIR "/home/backup5"

spawn ssh $USER@$IPSERV
expect "assword:"
send "$PASS\r"
expect "#"
send "tar -zcvf $TMPDIR/backup.tar.gz $BackupDirectories\r"
expect "#"
send "scp -r $TMPDIR/backup.tar.gz $SELFUSER@$SELFIP:$SELFDIR/\r"
expect {
-re ".*Are.*.*yes.*no.*" {
send "yes\r"
exp_continue
#look for the password prompt
}
"assword:" {
send "$SELFPASS\r"
#he expect command will now return
}
}

send "exit;\r"
expect eof


Этот скрипт коннектится на удаленный сервер используя язык tcl, и команду (метод) expect — метод пошагового выполнения алгоритма с ожиданием ответа с удаленного сервера. Далее создает бекап и копирует его на главный сервер используя тот же scp протокол. Этот скрип требует более скурпулезной отладки и настройки дополнительных пакетов tcl (expect) на серверах. Но все же он интересен в своем исполнении т.к. в целом показывает дополнительные возможности удаленной работы с серверами.

Эти скрипты можно также усовершенствовать. Дописать еще к примеру создание бекапов баз данных (делается в 1 строчку), также чтобы скрипт создавал бекапы с несольких, разных серверов автоматически (последовательно) и т д. Эту уже по вашему желанию. Также стоит прописать запуск этого скрипта с помощью крона, чтобы бекапы создавались автоматически через определенное время.

P.S. Желаю всегда иметь свежий бекап!
Tags:
Hubs:
+6
Comments 14
Comments Comments 14

Articles