Resultatet bliver, at hver gang scriptet kører, så bliver den ældste backup slettet, og de resterende baskups får hævet deres filnavn med 1. Det betyder at backup.1 bliver til backup.2, backup.2 til backup.3 osv. Som afslutning uploader scriptet så dagens backup som backup.1.
Først og fremmest er der selve FTP-programmet. Det startes fra terminalen ved at skrive "ftp" efterfulgt af enter, og minder en del om terminalen i sig selv. Det afsluttes igen ved at skrive "quit" eller "exit". I et script duer det ikke rigtig, for når ftp kaldes, så kan man ikke længere give det kommandoer fra scriptet.
Løsningen er at starte programmet med de kommandoer det skal bruge, for at lave sit arbejde. I det følgende er disse 3 variabler allerede sat:
Kode: Vælg alt
FTP_VÆRT="olsen.banden.dk"
FTP_BRUGER="egon"
FTP_KODE="benny"
I sin mest simple form kan ftp kaldes med 1 fast kommando
Kode: Vælg alt
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
list
close
quit" | ftp -n
I det her eksempel er kommandoen "list", som viser mappeindholdet. Men at have 1 fast kommando er meget lidt fleksibelt, så hvis koden i stedet bliver omdannet til en funktion, så kan vi kalde ftp med lige hvad vi måtte have brug for. Først bygges funktionen, som passende kan kaldes hjemmelavet_ftp:
Kode: Vælg alt
hjemmelavet_ftp() {
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
list
close
quit" | ftp -n
}
Og så skiftes "list" ud med "$1":
Kode: Vælg alt
hjemmelavet_ftp() {
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
$1
close
quit" | ftp -n
}
Dollartegnnet og 1tallet er synonym med den kommando, vi vil have indsat i stedet for. Funktionen bruges så ved at skrive navnet først, og så den ønskede kommando:
Kode: Vælg alt
hjemmelavet_ftp help
Når bash så kører linien, så bliver hjemmelavet_ftp erstattet med
Kode: Vælg alt
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
$1
close
quit" | ftp -n
$1 bliver så erstattet med "help" som viser hvilket kommandoer serveren understøtter.
Og violá, grundlaget for fuldautomatisk backup over FTP er lagt. Først skal funktionen dog udvides med $2 og $3:
Kode: Vælg alt
hjemmelavet_ftp() {
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
$1 $2 $3
close
quit" | ftp -n
}
Grunden er at vi får brug for 3 kommandoer. Hvis man kun bruger 1 eller 2 af dem, så gør det ikke noget, for bash ser bare bort fra de/n overskydende. Desuden skal der bruges 2 variabler mere, 1 som fortæller scriptet hvor mange kopier af backuppen der skal gemmes og roteres, og 1 som kun bliver brugt under selve roteringen. Lad os kalde dem ROTER_FTP og ROTER_LOOP. Det er kun ROTER_FTP som skal sættes, den anden bliver automatisk sat.
Det sidste der så mangler, er en løkke. En løkke et lille program, som gentager en eller flere handlinger, indtil en bestemt situation opstår. Vi vil gøre brug af while-løkken, som i sin grundform ser sådan her ud:
Kode: Vælg alt
while [ (testhandling) ] ; do
(handling som skal laves)
done
Hvad vi gør, er at vi først sletter den ældste backup på FTP-serveren, og så kører vi while indtil de resterende backups har fået nyt navn, og til sidst uploades dagens backup. Den færdige kode bliver så:
Kode: Vælg alt
#!/bin/bash
# Linien oppe over skal altid sættes i et bash-script, så Linux ved hvilken slags kode det er
# Først sættes variablerne
FTP_VÆRT="olsen.banden.dk"
FTP_BRUGER="egon"
FTP_KODE="benny"
# Og denne variabel fortæller scriptet hvor mange backups der skal gemmes
ROTER_FTP="7"
# Så laves funktionen
hjemmelavet_ftp() {
echo "open $FTP_VÆRT
user $FTP_BRUGER $FTP_KODE
verbose
$1 $2 $3
close
quit" | ftp -n
}
# Så bruges funktionen til at slette den ældste backup
hjemmelavet_ftp delete backup.$ROTER_FTP
# Så sættes den anden variabel, som skal bruges under omdøbningen imens while-løkken kører
# Først sættes de 2 variabler lig hinanden, og så trækkes der 1 fra ROTER_FTP som skal bruges
# under løkken. Grunden til at 2 variabler er nødvendige, er fordi både det gamle og nye navn skal
# bruges, og kun med variablerne kan vi holde styr på det.
ROTER_LOOP=$ROTER_FTP
ROTER_FTP=$((ROTER_FTP-1))
# Og endelig kan while-løkken slippes fri med funktionen.
# -ne betyder "not equal", og linien kan oversættes til "så længe ROTER_FTP ikke er lig 0"
while [ "$ROTER_FTP" -ne "0" ] ; do
hjemmelavet_ftp rename backup.$ROTER_FTP backup.$ROTER_LOOP
# Efter løkken har kørt, så trækkes der 1 fra hver variabel, sådan så while kan stoppe ved 0
ROTER_FTP=$((ROTER_FTP-1))
ROTER_LOOP=$((ROTER_LOOP-1))
# done afslutter løkken
done
# Det sidste der mangler er så at bruge funktionen til at uploade dagens backup
hjemmelavet_ftp put /lokal/sti/backup.1 /sti/på/ftp/backup.1
# Og så kan scriptet afsluttes med succes (hvilket er lig 0)
exit 0
Og det er alt hvad der er til det