Backup remoti automatici SSH


16

Ho due macchine Ae B. La macchina Apuò entrare B. Aha molto spazio libero. BI dati sono in una sorta di situazione rischiosa. Come posso eseguire il backup automatico di tutti Bi dati A. Non deve essere terribilmente frequente, ma dovrebbe essere a mani libere. Ogni volta che si Aavvia è abbastanza frequente. Ho sentito che la sincronizzazione può fare questo.

Risposte:


11

Per fare questo quotidianamente nella maggior parte delle distribuzioni Linux, dovresti essere in grado di inserire il rsynccomando (secondo la risposta di @ guido ) in uno script e inserire lo script nella /etc/cron.dailydirectory. Finché anacronè installato (potrebbe non essere predefinito) eventuali cron.dailylavori persi verranno rilevati al successivo avvio della macchina (oltre a essere eseguiti a mezzanotte se la macchina viene cambiata).

Per lo script faresti semplicemente:

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

È possibile aggiungere l' -zopzione (compressione) se il backup è su una connessione lenta (ish) o se si desidera risparmiare larghezza di banda, ma nella mia esperienza danneggerà effettivamente le prestazioni con le macchine / reti moderne.

Se si desidera conservare il registro di ciascun backup, è possibile fare qualcosa del tipo:

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

Nota perché funzioni come cron job, devi avere ssh senza password impostato per root su serverA per accedere a serverB. Deve essere l'account root (ovvero le chiavi /root/.ssh) poiché i cron.dailylavori vengono eseguiti come root.


Non necessariamente se si utilizza una chiave pubblica e cronjobs per utente.
Braiam,

@Braiam, anacronnon raccoglierà i cronlavori per utente . Sebbene sia sempre possibile utilizzare su/ sudodallo script per eseguire rsync come utente specifico. Ma nota che i tasti saranno tenuti in modo più sicuro sotto /root.
Graeme,

1
se vuoi usare un lavoro cron e ssh con root, è molto più sicuro limitare ciò che root può fare nel secondo computer nel file authorized_keys.
guido,

1
@guido, non è necessario accedere come root su serverB solo perché si è root su serverA. @JennyD ha già dato suggerimenti su cosa fare qui, ma userpotrebbe essere un normale utente su machineB a seconda di cosa si sta eseguendo il backup.
Graeme,

1
Molto probabilmente il tuo utente non ha accesso in lettura ai file su severB. In tal caso, è necessario utilizzare un utente che lo fa o assegnare all'utente corrente le autorizzazioni corrette aggiungendolo ai gruppi corretti o modificando le autorizzazioni sui file. Se aggiungi ls -lalla tua domanda un esempio degli errori che stai riscontrando e l'output di alcuni file, le persone possono fornire ulteriori consigli.
Graeme,

5

Suggerirei di usare rdiff-backup . Lo uso ora per eseguire backup incrementali automatici ogni notte dei miei dati (due workstation, due server e un account sul server di qualcun altro).

Ho usato rsync in precedenza per questo, ma sono passato a rdiff-backup poiché è più conveniente e può eseguire backup incrementali di file di grandi dimensioni come le immagini del disco della macchina virtuale. rdiff-backup è molto simile ai miei precedenti script di backup rsync, ma fatto bene .

Ho inserito un file di script in /etc/cron.daily sulla macchina in cui è archiviato il backup, che avvia rdiff-backup una volta al giorno al mattino presto e recupera i dati dalla macchina remota.


4

Oltre a tutte le risposte precedenti, eccone una che si basa su chiavi SSH con restrizioni su cosa si può fare quando si accede con quella chiave.

Sul server A

Su questo è meno importante se crei un utente separato o usi uno dei tuoi nomi utente esistenti, anche se se fossi io creerei un utente separato. Userò il nome utente bkpuserper entrambi i server nei miei esempi di seguito.

Una volta effettuato l'accesso bkpuser, creare una chiave SSH senza password.

Sul server B

Abilita PubkeyAuthenticationin sshd_config.

Crea l'utente bkpuser. Imposta una password molto complicata o disabilita l'accesso con password per quell'utente (esattamente come lo fai dipenderà da quale unix e distro stai eseguendo). Il punto è che l'utente deve accedere solo con una chiave SSH. Assicurarsi che bkpuserabbia accesso in lettura a tutte le directory e ai file di cui si desidera eseguire il backup.

Copia la parte pubblica della chiave creata su A ~bkpuser/.ssh/authorized_keyssu B. Modifica il per eseguire automagicamente un comando sulla connessione. Quel comando non dovrebbe essere un puntatore a uno script di shell; invece inserire direttamente lo script shell nella chiave. Includere anche una limitazione in modo che la chiave possa essere utilizzata solo dal server A e nessun altro server. Nell'esempio seguente, sto fornendo al server A l'indirizzo IP 10.1.2.3e presumo che i file di cui voglio eseguire il backup siano tutti sotto /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.....

Sul server A

Se si sta utilizzando una delle schede cron che supportano le @rebootvoci, aggiungere tale voce a bkpusercrontab con il comando ssh -i ~bkpuser/.ssh/id_dsa serverB > backup.tar.gz. Se non lo consente, impostalo in qualsiasi momento, se fossero i miei dati, probabilmente lo farei ogni giorno.


2

Ecco una soluzione completa per il backup del server B sul server A ogni giorno alle 4 del mattino usando SSH.

Creare una connessione SSH automatica dal server B al server A

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

Creare uno script di backup sul server 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

Automatizza il backup sul server B

crontab -e

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

Per maggiori dettagli vedere le pagine Connettersi a SSH senza inserire una password su Linux e fare il backup di un server su Debian o Ubuntu Linux .


1

Puoi usare rsync per questo (in un certo senso un modo inverso):

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

dove:

-avz  archive, compress and be verbose

Sono abbastanza sicuro -aimplica -r.
Shadur,

hai perfettamente ragione
guido

-1

Il nocciolo della questione è come farlo automaticamente (non è necessario inserire le password):

  • avviare una screeno tmuxsessione
  • eseguire eval $(ssh-agent)
  • aggiungi la tua chiave con ssh-add
  • flag per rsync export RSYNC_RSH="ssh -i ~/.ssh/id_rsa ..."
  • backup ogni 24 ore con while :; do rsync -av u@h:/p /local; sleep $[24*60*60]; done

+1 per chi non ha password ssh.
Graeme,

Quindi metterei tutti questi in una sceneggiatura di avvio, giusto?
PyRulez,

1
Penso che qui inizi la "domanda davvero importante" quanta sicurezza è necessaria? Farlo con password o senza? Funzionerà solo se 1) lo fai da B, sospendi o iberna A. Non funzionerà se spegni A. Se fai a meno delle password diventerai una sorta di "situazione rischiosa".

Non è necessario aggiungere RSYNC_SSHper cercare posizioni standard di chiavi SSH.
Pavel Šimerda,

1
Lo so. Hai anche supervisionato i ...punti in cui puoi aggiungere argomenti utili. Inoltre non hai letto il mio ultimo commento in cui menziono la "domanda davvero importante", quindi non lo farei mai con chiavi senza password. Dovrai anche abilitare PubkeyAuthenticatione nessuno lo ha detto.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.