Laboratorium 6
Skrypty Bash — tworzenie kopii zapasowych
Celem dzisiejszych zajęć jest napisanie skryptu, który wykona kopię zapasową całego katalogu /home użytkownika do pliku user_home_data_backup.tar.gz i zapisze go w katalogu /tmp/backup. Jeśli ktoś wie, jak to zrobić, może przystąpić do pracy. Jeśli nie, podczas zajęć omówimy wszystkie elementy składowe takiego skryptu, a Waszym zadaniem będzie złożenie ich w całość.
Pakowanie katalogu za pomocą tar
Wykorzystamy program tar, którego nazwa pochodzi od Tape Archiver. Początkowo służył do archiwizowania plików na taśmach magnetycznych. Obecnie tar jest używany do pakowania wielu plików w jedno archiwum, z opcjonalną kompresją.
Składnia:
1
tar [opcje] ścieżka_docelowa źródło
Samo wywołanie polecenia tar bez opcji nie przyniesie oczekiwanego efektu i wyświetli informacje o dostępnych opcjach. Najczęściej używane opcje to:
-f— określa nazwę pliku archiwum-c— tworzy nowe archiwum-x— rozpakowuje archiwum-v— wyświetla szczegółowe informacje o przetwarzanych plikach (tryb verbose)-z— kompresuje lub dekompresuje archiwum za pomocągzip, tworząc plik w formacie.tar.gz-t— wyświetla zawartość archiwum
Przykładowe użycie:
Tworzenie archiwum i kompresja:
1
tar -cvzf archiwum.tar.gz /ścieżka/do/katalogu
Rozpakowywanie archiwum:
1
tar -xvzf archiwum.tar.gz
Pobieranie nazwy użytkownika
Aby pobrać nazwę bieżącego użytkownika, możemy użyć polecenia:
1
whoami
Aby przypisać nazwę użytkownika do zmiennej w skrypcie, używamy:
1
user=$(whoami)
Jeśli chcemy utworzyć plik o nazwie zawierającej nazwę użytkownika, możemy użyć zmiennej:
1
touch "${user}_plik.txt"
Użycie nawiasów klamrowych ${user} pozwala na prawidłowe wstawienie wartości zmiennej w ciąg znaków bez ryzyka błędnej interpretacji przez powłokę.
Dodawanie daty do nazwy pliku
Chcąc dołączyć datę do nazwy pliku, skorzystamy z polecenia date. Polecenie to służy do wyświetlania lub ustawiania daty i czasu systemowego.
Formatowanie daty:
1
date +FORMAT
Gdzie FORMAT to ciąg znaków zawierający specyfikatory formatu.
Najczęściej używane specyfikatory:
%Y— rok (czterocyfrowy)%m— miesiąc (dwucyfrowy)%d— dzień miesiąca (dwucyfrowy)%H— godzina (24-godzinny format)%M— minuty%S— sekundy
Przykład pobrania bieżącej daty w formacie YYYY-MM-DD:
1
data=$(date +%Y-%m-%d)
Możemy teraz użyć zmiennej data w nazwie pliku:
1
plik="${user}_home_${data}.tar.gz"
Przekierowywanie wyjścia do /dev/null
W systemach Linux istnieje specjalny plik urządzenia o nazwie /dev/null, który jest “czarną dziurą” — wszystko, co zostanie do niego przekierowane, zostanie odrzucone.
Przekierowanie standardowego wyjścia błędów (STDERR) do /dev/null:
1
polecenie 2> /dev/null
Dzięki temu możemy ukryć komunikaty błędów generowane przez polecenie.
Skrypt końcowy
Zadanie polega na napisaniu skryptu, który utworzy kopię zapasową katalogu domowego użytkownika i zapisze ją w katalogu /tmp/backup pod nazwą zawierającą nazwę użytkownika oraz bieżącą datę.
Opis skryptu:
- Sprawdzamy, czy katalog
/tmp/backupistnieje; jeśli nie, tworzymy go za pomocąmkdir -p. - Pobieramy nazwę użytkownika za pomocą
whoamii przypisujemy ją do zmiennejuser. - Pobieramy bieżącą datę w formacie
YYYY-MM-DDi przypisujemy do zmiennejdata. - Definiujemy ścieżkę do pliku archiwum, wykorzystując zmienne
useridata. - Tworzymy archiwum za pomocą
tar, przekierowując komunikaty błędów do/dev/null. - Sprawdzamy, czy plik archiwum został utworzony, i informujemy użytkownika o wyniku operacji.
Uwagi:
- Upewnij się, że masz odpowiednie uprawnienia do odczytu katalogu
/home/$useroraz zapisu w katalogu/tmp/backup. - Jeśli chcesz zarchiwizować cały katalog
/home, zastąp/home/$userścieżką/homew poleceniutar.
Dodatkowe informacje
Formatowanie daty i czasu
Możemy dostosować format daty i czasu według własnych potrzeb, łącząc różne specyfikatory. Na przykład:
Bieżąca data i czas w formacie
YYYY-MM-DD_HH-MM-SS:1
data=$(date +%Y-%m-%d_%H-%M-%S)
Użycie nazwy miesiąca i dnia tygodnia:
1
data=$(date +%Y-%B-%d_%A)
Przekierowywanie wyjścia i błędów
Przekierowanie zarówno standardowego wyjścia (STDOUT), jak i błędów (STDERR) do
/dev/null:1
polecenie > /dev/null 2>&1
Użycie zmiennych w nazwach plików
Korzystanie z nawiasów klamrowych ${zmienna} jest dobrą praktyką, szczególnie gdy zmienna jest częścią większego ciągu znaków.
Przykład:
1
plik="${user}_plik.txt"