Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 06
Post

Użytkowanie komputerów i podstawy systemów operacyjnych - laboratorium 06

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/backup istnieje; jeśli nie, tworzymy go za pomocą mkdir -p.
  • Pobieramy nazwę użytkownika za pomocą whoami i przypisujemy ją do zmiennej user.
  • Pobieramy bieżącą datę w formacie YYYY-MM-DD i przypisujemy do zmiennej data.
  • Definiujemy ścieżkę do pliku archiwum, wykorzystując zmienne user i data.
  • 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/$user oraz zapisu w katalogu /tmp/backup.
  • Jeśli chcesz zarchiwizować cały katalog /home, zastąp /home/$user ścieżką /home w poleceniu tar.

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"