Brug Linux' kommandolinie FTP-program i scripts

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.
Brugeravatar
NickyThomassen
Admin
Indlæg: 3650
Tilmeldt: 5. mar 2010, 19:58
IRC nickname: nicky
Geografisk sted: 192.168.20.42

Brug Linux' kommandolinie FTP-program i scripts

Indlæg af NickyThomassen »

Jeg har lige haft brug for at kunne rotere og uploade backupfiler til FTP, fra et backupscript der kører hver nat. Det spændende er måske mest den endelige kode, men det vil jeg lade læseren om at vurdere.

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 :)
lath
Indlæg: 5095
Tilmeldt: 27. apr 2008, 02:16
IRC nickname: lars_t_h
Geografisk sted: Fyn

Re: Brug Linux' kommandolinie FTP-program i scripts

Indlæg af lath »

Af hvad jeg ved, så kan du også bruge curl og igår opdagede jeg at wget også kan ftp ved at jeg downloadede FreePascals dokumentation fra deres ftp server.

curl har en zillion parametre så du meget nøjagtigt kan styre din kommunikation over FTP, HTTP, HTTPS, og flere protokoller.

curl(1) man side her: http://manpages.ubuntu.com/manpages/precise/man1/curl.1.html
Eller når den er installeret .

Kode: Vælg alt

man 1 curl

eller bare

Kode: Vælg alt

man curl

(tryk på q-tast afslutter man pager)

/Lars
Jeg er Software ingeniør (Diplomingeniør) i Informationsteknologi og indlejede systemer, hvor indlejrede systemer er computer (microcontroller) + elektronik i for eksempel et TV, en router, en vaskemaskine og den slags