Automatyczne zdalne tworzenie kopii zapasowych SSH


16

Mam dwie maszyny Ai B. Maszyna Amoże ssh do B. Ama dużo wolnego miejsca. Bdane znajdują się w rodzaju ryzykownej sytuacji. Jak automatycznie wykonać kopię zapasową wszystkich Bdanych A. Nie musi to być strasznie częste, ale powinno być wolne od rąk. Za każdym razem Arozruch byłby wystarczająco częsty. Słyszę, że synchronizacja może to zrobić.

Odpowiedzi:


11

Aby robić to codziennie w większości dystrybucji Linuksa, powinieneś być w stanie po prostu umieścić rsyncpolecenie (zgodnie z odpowiedzią @ guido ) w skrypcie i umieścić skrypt w /etc/cron.dailykatalogu. Tak długo, jak anacronjest zainstalowany (może nie być domyślnie), wszelkie pominięte cron.dailyzadania będą wychwytywane przy następnym uruchomieniu komputera (a także uruchamiane o północy, jeśli maszyna zostanie przełączona).

W przypadku skryptu wystarczy wykonać:

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

Możesz dodać -zopcję (kompresji), jeśli kopia zapasowa jest wykonywana przez wolne połączenie (ish) lub jeśli chcesz zaoszczędzić przepustowość, ale z mojego doświadczenia wynika, że ​​faktycznie pogorszy to wydajność nowoczesnych maszyn / sieci.

Jeśli chcesz prowadzić dziennik każdej kopii zapasowej, możesz zrobić coś takiego:

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

Uwaga: aby działało to jako zadanie crona, musisz mieć skonfigurowane bez hasła hasło ssh dla roota na serwerze A, aby zalogować się na serwerze B. Musi to być konto root (tzn. Klucze do /root/.ssh), ponieważ cron.dailyzadania są uruchamiane jako root.


Niekoniecznie, jeśli używasz klucza publicznego i cronjobs na użytkownika.
Braiam

@Braiam, anacronnie odbiera cronzleceń dla poszczególnych użytkowników . Chociaż zawsze możesz użyć su/ sudoze skryptu, aby uruchomić rsync jako określony użytkownik. Pamiętaj jednak, że klucze będą bezpieczniej trzymane /root.
Graeme,

1
jeśli chcesz użyć zadania cron i ssh z rootem, znacznie bezpieczniej jest ograniczyć to, co root może zrobić na drugiej maszynie w pliku autoryzowanych_kluczy.
guido

1
@ guido, nie ma wymogu logowania się jako root na serwerze B tylko dlatego, że jesteś rootem na serwerze A. @JennyD już zasugerował, co robić tutaj, ale usermoże być zwykłym użytkownikiem na komputerze B, w zależności od tego , co chcesz wykonać kopię zapasową.
Graeme

1
Najprawdopodobniej twój użytkownik nie ma dostępu do odczytu plików na serwerze severB. W takim przypadku musisz użyć użytkownika, który to robi, lub przyznać bieżącemu użytkownikowi odpowiednie uprawnienia, dodając go do odpowiednich grup lub zmieniając uprawnienia do plików. Jeśli ls -ldo pytania dodasz próbkę błędów i wyniki niektórych plików, ludzie mogą udzielić dalszych porad.
Graeme

5

Sugerowałbym użycie rdiff-backup . Używam go teraz do tworzenia automatycznych przyrostowych kopii zapasowych każdej nocy moich własnych danych (dwie stacje robocze, dwa serwery i jedno konto na serwerze innej osoby).

Użyłem do tego rsync wcześniej, ale przełączyłem się na rdiff-backup, ponieważ jest to wygodniejsze i może tworzyć przyrostowe kopie zapasowe dużych plików, takich jak obrazy dysków maszyny wirtualnej. rdiff-backup jest podobny do moich poprzednich skryptów rsync do tworzenia kopii zapasowych, ale zostało zrobione dobrze .

Umieściłem plik skryptu w /etc/cron.daily na komputerze, na którym przechowywana jest kopia zapasowa, który uruchamia rdiff-backup raz dziennie wcześnie rano i pobiera dane ze zdalnego komputera.


4

Oprócz wszystkich poprzednich odpowiedzi, oto jedna, która opiera się na kluczach SSH z ograniczeniami dotyczącymi tego, co można zrobić po zalogowaniu się przy użyciu tego klucza.

Na serwerze A

W tym przypadku jest mniej ważne, jeśli utworzysz osobnego użytkownika lub użyjesz jednej z istniejących nazw użytkowników, choć gdyby to był ja, stworzyłbym osobnego użytkownika. W bkpuserponiższych przykładach użyję nazwy użytkownika dla obu serwerów.

Po zalogowaniu bkpuserutwórz klucz SSH bez hasła.

Na serwerze B

Włącz PubkeyAuthenticationw sshd_config.

Utwórz użytkownika bkpuser. Ustaw bardzo skomplikowane hasło lub wyłącz logowanie hasłem dla tego użytkownika (dokładnie to, jak to zrobisz, będzie zależeć od tego, jakiego uniksa i dystrybucji używasz). Chodzi o to, że użytkownik powinien zalogować się tylko za pomocą klucza SSH. Upewnij się, że bkpuserma dostęp do odczytu do wszystkich katalogów i plików, których kopię zapasową chcesz utworzyć.

Skopiuj część publiczną klucza utworzonego na A do ~bkpuser/.ssh/authorized_keysB. Edytuj. Aby automatycznie uruchomić polecenie przy połączeniu. To polecenie nie powinno być wskaźnikiem do skryptu powłoki; zamiast tego wstaw skrypt powłoki bezpośrednio do klucza. Uwzględnij również ograniczenie, dzięki któremu klucz może być używany tylko z serwera A, a nie z innego serwera. W poniższym przykładzie podaję adresowi IP serwer A 10.1.2.3i zakładam, że wszystkie pliki, których kopię zapasową chcę wykonać, są poniżej /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.....

Na serwerze A

Jeśli używasz jednej z kart cron, która obsługuje @rebootwpisy, dodaj taki wpis do bkpusers crontab za pomocą polecenia ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Jeśli to nie pozwala, ustaw je w dowolnym momencie - gdyby były to moje dane, prawdopodobnie zrobiłbym to codziennie.


2

Oto kompletne rozwiązanie do tworzenia kopii zapasowych serwera B na serwerze A każdego dnia o 4 rano za pomocą SSH.

Utwórz automatyczne połączenie SSH z serwera B do serwera A.

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

Utwórz skrypt kopii zapasowej na serwerze 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

Zautomatyzuj tworzenie kopii zapasowych na serwerze B

crontab -e

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

Aby uzyskać więcej informacji, zobacz strony Połącz się z SSH bez podawania hasła w systemie Linux i Utwórz kopię zapasową serwera w systemie Debian lub Ubuntu Linux .


1

Możesz do tego użyć rsync (w pewnym sensie odwrotnej):

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

gdzie:

-avz  archive, compress and be verbose

Jestem pewien, że -aimplikuje -r.
Shadur

masz całkowitą rację
guido

-1

Sedno sprawy polega na tym, jak to zrobić automatycznie (nie trzeba wprowadzać haseł):

  • rozpocznij sesję screenlubtmux
  • wykonać eval $(ssh-agent)
  • dodaj swój klucz za pomocą ssh-add
  • flagi dla rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • kopie zapasowe co 24 godziny z while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1 dla hasła bez hasła ssh.
Graeme,

Umieściłbym to wszystko w skrypcie startowym, prawda?
PyRulez

1
Myślę, że tutaj zaczyna się „naprawdę ważne pytanie”, ile bezpieczeństwa jest potrzebne? Czy to z hasłami czy bez? Działa to tylko wtedy, gdy 1) zrobisz to z B, zawiesisz lub hibernujesz A. Nie zadziała, jeśli wyłączysz A. Jeśli obejdziesz się bez haseł, staniesz się „ryzykowną sytuacją”.

Nie trzeba dodawać RSYNC_SSHdo wyszukiwania standardowych lokalizacji kluczy SSH.
Pavel Šimerda

1
Wiem to. Nadzorowałeś także ...kropki, w których możesz dodawać przydatne argumenty. Nie przeczytałeś też mojego ostatniego komentarza, w którym wspominam o „naprawdę ważnym pytaniu”, dlatego nigdy nie zrobiłbym tego z kluczami bez hasła. Musisz także włączyć PubkeyAuthenticationi nikt tego nie powiedział.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.