Skocz do zawartości

Bash: Skrypt Do Backupu, Problem


morsik

Rekomendowane odpowiedzi

Witam.

Postanowiłem trochę się poduczyć i napisać sobie (prawie) prosty skrypt do robienia backupu w bashu.

Może najpierw kod, a potem opis problemu ;)

#!/bin/bash

source /etc/init.d/functions.sh

einfo "Backup script"
einfo "File to backup: ${1}"

ContinueMenu=1
while (( ContinueMenu ))
do
       echo -n "Do you want to continue? [Y/n] "

       read KeyToContinue

       if [[ $KeyToContinue = "n" || $KeyToContinue = "N" ]]
       then
               ewarn "Cancelled by user"
               ContinueMenu=0
       elif [[ $KeyToContinue = "y" || $KeyToContinue = "Y" || $KeyToContinue = "" ]]
       then
               einfo "Backuping selected files"
               ebegin "Creating temporary directory"
               CurrentDate=$(date +%d-%m-%Y)
               TempDir="/tmp/backup/backup-${CurrentDate}"
               mkdir -p "${TempDir}" # Create temp directory
               eend "$?"

               exec 0<"${1}"
               while read FileToBackup
               do
                       if [[ ! -e $FileToBackup ]]
                       then
                               ewarn "File '${FileToBackup}' does not exist!"
                               BackupWarnings=1
                       else
                               ebegin "Copying file '${FileToBackup}' to temporary directory"
                               install "${FileToBackup}" "${TempDir}${FileToBackup}" -D
                               eend "$?"
                       fi
               done

               ebegin "Compressing data"
               cd "${TempDir}"
               tar cjf "${TempDir}.tar.bz2" *
               eend "${?}"
               rm -rf ${TempDir}
               ContinueMenu=0
       else
               ewarn "You must specify some option:"
               echo "[Y] Yes - Continues backup process"
               echo "[N] No - Aborting backup process"
               ContinueMenu=1
       fi
done

Info:

Jak zapewne zauważyliście, w linii numer 3 jest wpis o source, ponieważ skrypt ten korzysta z pewnych estetycznych funkcji Gentoo i robi ładne informacje. W późniejszym okresie przekopiuję potrzebne funkcje i dodam do skryptu, narazie aby odpalić na Fedorze należy wszystkie funkcje ewarn, einfo, eerr oraz ebegin, zamienić na echo, a eend "${1}" usunąć. Powinno zadziałać.

 

Opis problemu:

Skrypt pobiera listę plików z pliku wskazanego w argumencie.

/etc/httpd/conf.d/httpd.conf
/etc/mysql.conf
/etc/mplayer/mplayer.conf

Jednak nie zadziała przy użyciu maski takiej jak:

/etc/*
/mnt/Dane/Zdjęcia/dscn????.jpg
/mnt/Dane/public/html/*

Zupełnie nie wiem jak można to zrobić, bo pisanie każdego pliku z osobna (a lista przecież ciągle się zmienia) jest dość męczące ;)

 

Z góry dzięki za pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

Nie łatwiej by Ci było zamiast tego:

 

                                install "${FileToBackup}" "${TempDir}${FileToBackup}" -D

 

przekazać bezpośrednio listę plików do tara?

 

                tar cjf "${TempDir}.tar.bz2" *

 

Albo jeszcze inaczej - zbudować listę plików w pliku tekstowym (ze ścieżkami bezwzględnymi) i tym go "nakarmić"

 

p.s. Nie zrozum mnie źle, ale strasznie jest zakombinowany ten skrypt... A co z KISS? ;)

Odnośnik do komentarza
Udostępnij na innych stronach

No właśnie ścieżki bezwzględne działają, ale ja bym chciał po masce lecieć ;)

Przekazać bezpośrednio... Nie wiem jakby to miało działać ;)

 

Wiem że trochę nabazgrałem, no ale coś sam zrobiłem w końcu :P

 

KISS? Hmm... głównie ma być to prosty i działający skrypt do robienia backupu potrzebnych plików, nie całych partycji, tą wersję można uznać za FileBackuper-alpha1 :P

Odnośnik do komentarza
Udostępnij na innych stronach

Zupełnie nie wiem jak można to zrobić, bo pisanie każdego pliku z osobna (a lista przecież ciągle się zmienia) jest dość męczące ;)
Np.
find /etc -name "*" > ${FileToBackup}
find /mnt/Dane/Zdjęcia -name "dscn????.jpg" >> ${FileToBackup}
find /mnt/Dane/public/html -name "*" >> ${FileToBackup}

Ale jak wspomniał już Arabski strasznie zakręcony ten skrypt ;)

 

Odnośnik do komentarza
Udostępnij na innych stronach

Może odpowiem tak:

 

#!/bin/bash

time=`date +%j_%y-%H_%M_%S`
dir="/root/conf-backup/"$time"-settings_backup"
ext=".tar.bz2"
name=$dir$ext

echo "Creating : "$name
tar -c -j -p -P --directory / --files-from=/root/bin/backup_filelist -f $name

 

Pakuje z zachowaniem uprawnień i ze ścieżkami bezwzględnymi z przygotowanej listy plików.

 

A co do KISS -

 

Pierwsze primo: trzymałbym się raczej czystego basha, niż jakiś predefiniowanych funkcji. Większa "przenośność" (fuj, paskudne słowo).

Drugie primo: popatrz na Twój i na mój - widzisz różnicę? ;)

 

p.s. Polecam man tar :ph34r:

Odnośnik do komentarza
Udostępnij na innych stronach

No mana czytalem ale nie myslalem ze moze miec taka fajna funkcje ;)

Glownie chodzilo wlasnie o --files-from.

Dziala, musze jeszcze tylko rozwiazac problem nieistniejacych plikow, czyli gdy w pliku z lista wystapi plik ktory nie istnieje :)

 

Dzieki ;)

 

EDIT$ Niestety ten sposób także nie działa. Dalej muszę podać bezwzględną ścieżkę do każdego z plików.

Odnośnik do komentarza
Udostępnij na innych stronach

musze jeszcze tylko rozwiazac problem nieistniejacych plikow, czyli gdy w pliku z lista wystapi plik ktory nie istnieje

 

Faktycznie tar marudzi jak pliku nie ma. Ale skoro chcesz mieć interaktywne dodawanie, to sprawdzanie czy plik istnieje możesz zrobić zanim wsadzisz go na listę.

Odnośnik do komentarza
Udostępnij na innych stronach

Skryptami dawno się nie bawiłem (ostatnio sh na Unix SCO) ale proponuje zamienić pętle while na for

 

for linia in `less test`; do echo $linia; done

 

gdzie test to:

 

 /home/tom*
/FILES/Programy/*

 

i daje wynik

 

[tomek@localhost ~]$ for linia in `less test`; do echo $linia; done
/home/tomek
/FILES/Programy/3630Driver(Eng)_0413.zip
/FILES/Programy/bcm43xx
/FILES/Programy/bios 2.70.zip
/FILES/Programy/boot98.exe
/FILES/Programy/compiz-fusion-0.6.99.i386
/FILES/Programy/dvdauthor-0.6.14
/FILES/Programy/DVDStyler-1.6.2

 

Może to troche niezbyt nowoczesne, ale działa na bashu w F8

Odnośnik do komentarza
Udostępnij na innych stronach

Może co powiem teraz to głupota, ale czy to nie jest tylko problem pisowni w pliku zawierającym dane do zbackupowania tj.

 

Jeżeli chcesz zrobić backup /etc to piszesz tylko /etc a nie /etc/*

 

Operacje na katalogach chyba są podobne do tych na plikach przy pisaniu skryptów?

Odnośnik do komentarza
Udostępnij na innych stronach

Ehhh... skrypt ma być uniwersalny. Jeden będzie chciał spakować /etc/* a inny /etc/conf.d/* a jeszcze inny /mnt/Dane/Zdjęcia/*.jpg

 

Pewnie powiecie abym spróbował jakiegoś gotowego programu. No z chęcią, tylko podajcie taki program, który mi zarchiwizuje katalogi, a nie całą partycje. Patrzyłem na partimage, ale on właśnie całe partycje tylko umie. O innych nie słyszałem.

Odnośnik do komentarza
Udostępnij na innych stronach

(...) tylko podajcie taki program, który mi zarchiwizuje katalogi, a nie całą partycje.
morsik, o co Tobie własciwie chodzi? :) Przecież tar jest właśnie takim programem. Podając odpowiednie opcje możesz zbackupować zawartość katalogu /etc bez podkatalogów albo jeśli chcesz rekursywnie z podkatalogami, możesz sobie zbackupować /etc/conf.d osobno itd itd. tar kopiuje katalogi a nie partycje, aktualna listę plików mozna budować tak jak pokazalem wyżej bezpośrednio przed rozpoczęciem kopii. Nie rozumiem dlaczego upierasz się przy wzorcu /etc/* jeśli można w skrypcie budować plik tymczasowy z aktualną listą plików, wykonać tar i usunąć plik, żeby czysto było?

Jakoś się pogubiłem i nie wiem czego tak naprawdę potrzebujesz... :lammer: Chyba, że zależy Ci na znalezieniu rowziązania jako takiego niezależnie od jego efektywności, czyli po prostu "sztuka dla sztuki" ;)

Odnośnik do komentarza
Udostępnij na innych stronach

No trochę mnie wena twórcza rozpiera :P

A tak na serio. Chodzi o to, że mogę i dać to /etc jak mówisz, ale chodzi o to, że w jednym pliku konfiguracyjnym, mogę podać kilka ścieżek do różnych plików. Chce mieć jedno archiwum, prostym kosztem jednego pliku. Zautomatyzowane ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...