Automatisk backup via SSH

Har du en guide til en funktion eller et program? Har du tips og trick, som du gerne vil dele med andre? Post dem her.
naucher
Indlæg: 359
Tilmeldt: 23. jan 2009, 21:14
IRC nickname: naucher
Geografisk sted: Aabenraa

Automatisk backup via SSH

Indlæg af naucher »

Dette er ganske vist langt fra den første og eneste guide, der er skrevet om emnet "sikkerhedskopi", men da jeg ikke syntes at være blevet hjulpet helt i mål af de guides og tråde i forum, der allerede findes, synes jeg, at jeg vil delagtiggøre forum i, hvordan jeg har løst opgaven.

Først og fremmest har jeg hentet inspiration i laoshi's guide om "Daglig backup af vigtige filer" https://ubuntudanmark.dk/forum/viewtopic.php?f=11&t=5881, hvori bliver man vejledt i brugen af rsync, samt hvordan man laver et script, der kan køres via terminalen eller ved dobbeltklik på filen.

For det andet har jeg læst Troy Johnsons indlæg på http://troy.jdmz.net/cron/, hvor man bliver vejledt i brugen af det indbyggede og meget stærke værktøj, "cron", hvormed man kan igangsætte kodelinier eller scripts på ethvert tænkeligt tidspunkt efter eget ønske.

For det tredie (og sidste) har jeg haft brug for værktøjet ssh-keygen, hvormed man får dannet certifikat-filer i stil med Digital Signatur, hvilket jeg bruger til automatisk at logge ind på en anden computer på det lokale netværk via ssh.

Men nu til sagen:

Backup script har jeg - med mine egne tilpasninger - blot brugt scriptet fra laoshi's guide https://ubuntudanmark.dk/forum/viewtopic.php?f=11&t=5881.
Dog har jeg slettet $HOME de steder, hvor denne variabel optræder, og erstattet det med "/home/migselv/", hvilket jeg har været nødt til fordi scriptet skal køres som root - og som root vil $HOME give et andet resultat end forventet. Grunden til at scriptet skal køres som root er, at man ellers får man ikke adgang til /etc/mapperne, men derimod blot får fejlmeldingen: "permission denied"

SSH-adgang til destinationen har været nødendig fordi jeg ville lægge sikkerhedskopien på min NAS-server, der er en lagerenhed med egen IP-adresse på det lokale netværk. For at få adgang til den, må man angive NAS-serverens adgangskode, hvilket altså skal gøres tre gange for at gennemføre det nævnte rsync-script. Og det er jo ik' smart!

Kommandoen ...

Kode: Vælg alt

ssh-keygen
... genererer 2 stk. nøgle-filer, nemlig "id_rsa" og "id_rsa.pub". Man kan selv angive et bedre navn, hvis man ikke kan lide "id_rsa". Man bliver også bedt om at oprette en adgangskode til disse nøgler, men det er jo netop meningen at scriptet skal kunne køre automatisk og uden brugerinput, så det med adgangskode dropper vi!

De to nøglefiler udgør hhv. en privat nøgle (den første fil) og en offentlig nøgle (pub-filen). Den offentlige nøgle skal nu lægges ind i modtagerens (=NAS-serverens) "authorized_keys"-fil, hvilket gøres med kommandoen:

Kode: Vælg alt

cat id_rsa.pub >> authorized_keys2

De to >> angiver, at id_rsa.pub skal tilføjes til authorized_keys2.
Hvis man i stedet kun bruger en >, så bliver hele indholdet i authorized_keys2 erstattet/udfyldt med indholdet af id_rsa.pub
Historien her handler om, at man efterfølgende kan indlægge offentlige nøgler fra flere forskellige computere i serverens "authorized_keys"-fil.

Filen authorized_keys2 uploader jeg til NAS-serveren, hvor filen skal ligge i "den rigtige mappe", hvilket hos mig er: /etc/config/ssh

Idet jeg har placeret de to nøglefiler i mappen .ssh i min hjemmemappe, kan jeg nu teste adgangen via nøglefil med

Kode: Vælg alt

ssh -i ~/.ssh/id_rsa admin@192.168.10.4


Backup scriptet kan nu tilpasses en smule, idet ovenstående nøgle skal angives, således:

Kode: Vælg alt

rsync -e 'ssh -i /home/[migselv]/.ssh/id_rsa'
... samt destinationen ...:
admin@192.168.10.4:/share/backup/


I sin helhed ser mit backup-script nu således ud:

Kode: Vælg alt

#!/usr/local/bin/backup.sh 

# Definitioner:
OPTS="-h -v --stats -C --update -z -a --exclude-from=/home/migselv/.ekskluder --delete-after "
DATO=`date '+%Y.%m.%d'`
LOG="--log-file=/home/migselv/Dokumenter/.backup-logs/$DATO"
DEST="admin@192.168.10.4:/share/Backup"

#Script:
# "Backup af /etc/ mappen til NAS"
rsync -e 'ssh -i /home/migselv/.ssh/id_rsa'    $OPTS    $LOG.etc   /etc      $DEST/

# "Backup af /usr/local/ mappen til NAS"
rsync -e 'ssh -i /home/migselv/.ssh/id_rsa'    $OPTS    $LOG.usr   /usr/local/   $DEST/usr_local/

# "Backup af /home/migselv/ mappen til NAS"
rsync -e 'ssh -i /home/migselv/.ssh/id_rsa'    $OPTS   $LOG.home   /home/migselv   $DEST/


Det skal bemærkes, at afsnittet 'ssh -i /home/migselv/id_rsa' ikke fungerer, hvis det lægges ind i en variabel. Jeg har derfor måtte angive det "direkte" i hver kodelinie - og ikke øverst under definitionen af OPTS

Det er nok også på sin plads at nævne, at jeg i filen .ekskluder har angivet, hvilke filer og mapper, jeg ikke ønsker at backup'en skal omfatte.

Er vi så snart færdige?

Ja, det er ikke meget galt - vi mangler blot at få kørt scriptet helt af sig selv og uden min aktive medvirken med jævne mellemrum.

Crontab er svaret på, hvordan man får skidtet til at køre af sig selv.
Det kan indledningsvis være en god ide at læse man-siderne til cron, hvor disse fire sider anbefales af http://troy.jdmz.net/cron/:

Kode: Vælg alt

  man crontab
  man -s 5 crontab
  man -s 8 crontab
  man cron

For at få oprettet en crontab bruges blot koden:

Kode: Vælg alt

sudo crontab -e

Herved får man adgang til root's crontab. Man kan også blot angive "crontab -e" som kode (uden sudo), hvorved man får adgang til "sin egen" crontab.
Desværre har det vist sig, at backup-scriptet (på grund af "/etc/") ikke fungerer, når det ikke er root, som udfører.
Derfor bruger jeg altså: sudo crontab -e

Kommandoen åbner den lille teksteditor "nano", hvor kan man kan skrive sin kode, gemme filen (med ctrl+O) og lukke editoren igen (med ctrl+X)

Crontabs øverste linje ser som udgangspunkt således ud:

Kode: Vælg alt

# mh hd dom moy dow    command

Dette er en angivelse af, hvordan man "programmerer" cron, og kan læses således:
  • mh = minute of the hour
  • hd = hour of the day
  • dom = day of the month
  • moy = month of the year
  • dow = day of the week
  • command line


Jeg kan anbefale, at læse mere om emnet på http://troy.jdmz.net/cron/, og blot afslutte dette indlæg med at angive "min" kodning af cron, som i al sin enkelthed betyder, at scriptet "backup.sh" bliver kørt hver anden time hver fredag, lørdag og søndag, første gang kl. 15 og sidste gang kl. 21:

Kode: Vælg alt

   0   15-21/2   *   *   5-7   /usr/local/bin/backup.sh
De bedste hilsner
Naucher

Begejstret Bruger
Lenovo Thinkpad L15 (årg. 2023) | 16,0 GB RAM | 400 GB disk || Ubuntu 23.10
Lenovo Thinkpad S540 (årg. 2014) | 8,0 GB RAM | 400 GB disk || Ubuntu 22.04LTS