Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Jun 2011

bash rsync script

Hej jag försöker lära mig scripting i bash genom att göra ett lite avancerat rsync script.
Jag har flera servrar som skall göras backup av vilket läses in från en fil av en while loop. Däremot så skall flera olika mappar göras backup av: /home /etc och på vissa servrar /var

Istället för att ha samma rad på flera ställen i scriptet skulle jag vilja ha en loop som kör igenom en variabel för att ändra vilken mapp som görs backup av. Jag antar också att jag behöver en if sats då backupen inte ska inkludera /var på alla servrar.

Där är min huvudvärk; hur jag använder en till while loop eller for loop som läser en variabel med flera värden, eller en array och även kollar vad värdet på variabeln host har för att utesluta /var när backupen körs på de hosts där den inte ska tas med.

Koden hitils:

while read host do for i in rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@$host:/home /var/backup/$host/ done done < /var/backup/testscripts/hosts

vill alltså ersätta /home med de olika käll mapparna på servrarna

Moderkort: Asus Maximus VI Hero CPU: i7 4770k RAM: G.Skill Ares 16GB
PSU: Corsair TX Series 650W GPU: GIGABYTE GTX670 OC
Chassi: Antec P280 Cpu-Kylare: Stock SSD: Samsung 840 EVO Series 250GB
OS: Windows 10 Pro x64

Trädvy Permalänk
Medlem
Plats
0:0:0:0:0:0:7f00:1
Registrerad
Aug 2005

Bara så jag är med, du vill köra din rsync från central server istället för att skapa ett cron på de servrar du vill ha backup ifrån?

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Jun 2011
Skrivet av Kalasis:

Bara så jag är med, du vill köra din rsync från central server istället för att skapa ett cron på de servrar du vill ha backup ifrån?

Ja precis! Sciptet ska köras ifrån en backup server och använda ssh till de andra servrarna för att göra backupen

Moderkort: Asus Maximus VI Hero CPU: i7 4770k RAM: G.Skill Ares 16GB
PSU: Corsair TX Series 650W GPU: GIGABYTE GTX670 OC
Chassi: Antec P280 Cpu-Kylare: Stock SSD: Samsung 840 EVO Series 250GB
OS: Windows 10 Pro x64

Trädvy Permalänk
Medlem
Plats
0:0:0:0:0:0:7f00:1
Registrerad
Aug 2005
Skrivet av DragonRapide:

Ja precis! Sciptet ska köras ifrån en backup server och använda ssh till de andra servrarna för att göra backupen

Du bör, kunna ha en fil med speciferade mappar det ska köras från.
Hittade ett bra exempel igår när jag googlade lite på bekymret,

http://unix.stackexchange.com/questions/231347/rsync-backup-s...

Trädvy Permalänk
Medlem
Plats
127.0.0.1
Registrerad
Jun 2011
Skrivet av Kalasis:

Du bör, kunna ha en fil med speciferade mappar det ska köras från.
Hittade ett bra exempel igår när jag googlade lite på bekymret,

http://unix.stackexchange.com/questions/231347/rsync-backup-s...

Hmm ungefär som jag gör med hostnamnen. Länken var lite avancerad för att jag skulle förstå allt.
Den här raden:

[[ "$line" =~ ^\[([A-Z_0-9]+)\] ]]

betyder den att den kollar i $line för att kolla så att det som finns där i börjar en bokstav eller en siffra. Så att man inte kör resten om $line innehåller en kommentar tex.

then echo "section $section"

var kommer hamna i den variabeln förstår jag inte riktigt?

Nu har jag en fil där det bara är upradat med hostname av servrarna:
server1
server2
server3
osv...

om jag istället gör om filen till:

[SERVER] HOST=server1 SOURCE="/home" SOURCE="/etc" [SERVER] HOST=server2 SOURCE=/home" SOURCE="/etc" SOURCE="/var" [EOF]

Borde jag då kunna köra meuh´s kod med lite modifikation

while read line do if [[ "$line" =~ ^\[([A-Z_0-9]+)\] ]] then if [ -n "$HOST" -a -n "$SOURCE] then echo "section $section" rsync -chazP --fake-super --rsync-path="sudo rsync" --stats backup@$host:$SOURCE /var/backup/$host/ fi section=${BASH_REMATCH[1]} # captured from =~ regex above unset OPTIONS REMOTE_IP SOURCE DESTINATION else eval $line fi done

Moderkort: Asus Maximus VI Hero CPU: i7 4770k RAM: G.Skill Ares 16GB
PSU: Corsair TX Series 650W GPU: GIGABYTE GTX670 OC
Chassi: Antec P280 Cpu-Kylare: Stock SSD: Samsung 840 EVO Series 250GB
OS: Windows 10 Pro x64