wtorek, 6 września 2011

backup automatyczny za pomocą lftp, instalacja lftp, konfiguracj ssl, skrypt do automatycznego backupu

Od jakiegoś czasu chciałem stworzyć jakiś skrypt, który umożliwia tworzenie automatycznego backupu za pomocą ftp.
Gdy zacząłem się nad tym zastanawiać to stwierdziłem jednak, że ftp nie jest bezpieczne i trzeba korzystać z sftp.

Traf chciał że bawiłem się już kiedyś lftp więc wybór klienta padł właśnie na ten program.

Pomyślałem, że w Debianie nie powinno być żadnych problemów z instalacją lftp:
- apt-get install lftp

Wszystko fajnie, ale po instalacji nie chciał mi się łączyć przez sftp, więc zaczynam drążyć:
- sprawdzam gdzie siedzi lftp "which lftp",
- sprawdzam biblioteki " ldd /usr/local/bin/lftp | grep ssl"
- wszystko fajnie, niestety zainstalował się bez obsługi ssl.

Instalacja ssl przebiegła bez żadnych komplikacji "apt-get install libssl-dev".
Usunąłem lftp "apt-get remove lftp" i zainstalowałem ponownie "apt-get install libssl".
Niestety "ldd /usr/local/bin/lftp | grep ssl" dalej bez wsparcia dla ssl.

Nie pozostało mi więc nic innego jak odinstalować lftp i kompilować.

Zaczęło się od pobrania archiwum ze strony:
ftp://ftp.st.ryukoku.ac.jp/pub/network/ftp/lftp/

Po rozpakowaniu, zapodaniu chmod u+x -R katalog, próba uruchomienia "./configure --with-openssl=/usr/lib" i zaczęły pojawiać się niespełnione zależności.

Więc kolejno instalowałem (być może trochę za dużo tego zainstalowałem ale ... w ostatecznym rozrachunku zadziałało):
- apt-get install gobjc++-4.4
- apt-get instal gawk
- apt-get install g++
- apt-get install libreadline-dev
- apt-get install make

Po instalacji powyższych zapodałem "make && make install".
Myślałem że zacznie działać ale przy wpisaniu polecenia lftp pojawiał się komunikat nie ma takiego pliku ani katalogu.
Pozostało ułatwić sobie życie zamiast wpisywać ścieżkę do programu za każdym razem "alias lftp="/usr/local/bin/lftp"" .

Przyszedł czas na testy więc stworzyłem plik skrypt.sh z następującą zawartością:
#!/bin/bash
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu

Po odpaleniu skryptu "./skrypt.sh" zostałem automatycznie zalogowany.



Stwierdziłem, że wpisywanie dla każdego pliku put nie ma większego sensu więc, chciałem żeby skrypt działał tak jak rsync - sprawdza czy na serwerze docelowym brakuje plików/katalogów i w razie potrzeby kopiuje na serwer tylko te brakujące.

Z pomocą przyszło polecenie mirror:
Mirror wskazanego zdalnego katalogu do lokalnego katalogu

-c, --continue kontynuuj pracę mirrora o ile to możliwe
-e, --delete skasuj pliki nie występujące w zdalnym serwisie
--delete-first skasuj stare pliki przed ściągnięciem nowych
-s, --allow-suid ustaw bity suid/sgid zgodnie ze zdalnymi
--allow-chown próbuj ustawiać właściciela i grupę na plikach
--ignore-time ignoruj czas przy decydowaniu czy ściągać
-n, --only-newer pozyskuj tylko nowsze pliki (-c nie działa)
-r, --no-recursion nie wchodź do podkatalogów
-p, --no-perms nie ustawiaj praw dostępu do plików
--no-umask nie używaj umaski dla praw plików
-R, --reverse przeciwny mirror (umieszczaj pliki)
-L, --dereference pozyskuj dowiązania symboliczne jako pliki
-N, --newer-than PLIK pozyskuj pliki tylko nowsze niż PLIK
-P, --parallel[=N] pozyskuj N plików równolegle
-i RX, --include RX dołącz pasujące pliki
-x RX, --exclude RX wyłącz pasujące pliki
RX jest rozszerzonym wyrażeniem regularnym
-v, --verbose[=N] dodatkowe komunikaty
--log=PLIK zapisz wykonywane polecenia lftp do PLIK
--script=PLIK zapisz polecenia lftp do PLIK ale nie wykonuj ich
--just-print to samo co --script=-
--dry-run to samo co --script=-

Chciałem, żeby pliki z katalogu lokalnego zostały wgrane na serwer, ale tylko te, których brakuje.
Wystarczyło wpisać "mirror -R katalog_lokalny katalog_zdalny" .

W ten sposób wszystkie pliki i katalogi znajdujące się na domowym komputerze i których brakowało na serwerze zostały przesłane na serwer.

No dobrze ale jak wkomponować polecenie mirror aby było uruchamiane bez ingerencji człowieka automatycznie:
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu -e "mirror -R katalog_lokalny katalog_zdalny"

Efektem wykonania powyższego polecenia było:

./skrypt.sh
Sumując: 3 katalogi, 3 pliki, 0 dowiązań symbolicznych.
Nowych: 1 plik, 0 dowiązań symbolicznych.

Plik oraz katalog, które znajdowały się tylko na lokalnym komputerze zostały wgrane na serwer.

Pozostało jeszcze zakończyć połączenie po przesłaniu plików dodałem więc:
lftp -u login,hasło sftp://adres_serwera.pl -p numer_portu -e "mirror -R katalog_lokalny katalog_zdalny" -e "exit" .


Może się Wam wydawać, że wówczas zostaną zerwane połączenia ale tak nie będzie:
"exit will exit from lftp or move to background if there are active
jobs. If no job is active, code is passed to operating system as lftp's
termination status. If code is omitted, the exit code of last command
is used.
"


Wystarczy w ten sposób przygotować skrypt, dodać jego wykonywanie do harmonogramu zadań cron i można spać spokojnie.


P.S.

Jeżeli komuś się przydadzą powyższe informacje i zacznie z ich pomocą tworzyć automatyczne backupy ... to liczę przynajmniej na browara :).

Brak komentarzy:

Prześlij komentarz