🢂Przydatne Skrypty w Bash dla Administratora

Skrypty zebrane w jednym miejscu

Aby skrypty działały, musisz mieć skonfigurowany system do wysyłania e-maili (np. przez Postfix czy Exim) oraz upewnić się, że narzędzie mail.

Skrypt do tworzenia kopii zapasowych

#!/bin/bash
# Ustawienia
DATA=$(date +%Y-%m-%d)
SOURCE_DIR="/home/user/important_files"
DESTINATION_DIR="/backup"
EMAIL="admin@example.com"
SUBJECT="Błąd podczas archiwizacji plików"

# Tworzenie katalogu kopii zapasowych
mkdir -p "$DESTINATION_DIR/$DATA"

# Archiwizacja plików
tar -czf "$DESTINATION_DIR/$DATA/$DATA.tar.gz" "$SOURCE_DIR" 2>/tmp/error.log
if [ $? -ne 0 ]; then
    MESSAGE=$(< /tmp/error.log)
    echo "Wystąpił problem podczas archiwizacji plików: $MESSAGE" | mail -s "$SUBJECT" "$EMAIL"
else
    echo "Archiwizacja plików zakończona pomyślnie."
fi

# Usunięcie starych niż 7 dni kopii zapasowych (opcjonalnie) - odkomentuj linie poniżej
# find $DESTINATION_DIR -type f -mtime +7 -delete

Backup plików konfiguracyjnych

#!/bin/bash
backup_dir="/backup/configs/$(date +%Y-%m-%d)"
mkdir -p "$backup_dir"
cp /etc/nginx/nginx.conf "$backup_dir/nginx.conf"
cp /etc/httpd/conf/httpd.conf "$backup_dir/httpd.conf"
echo "Backup plików konfiguracyjnych zakończony."

Skrypt do automatyzacji zadań

#!/bin/bash

# Ustawienia ścieżki, gdzie znajdują się skrypty
SCRIPT_PATH="/home/user/scripts"

# Adres e-mail do powiadomień o błędach
EMAIL="admin@example.com"
SUBJECT="Błąd wykonania skryptu"

# Lista skryptów do wykonania
SCRIPTS=(
    "script1.sh"
    "script2.sh"
    "script3.sh"
)

# Pętla przez wszystkie skrypty w tablicy
for script in "${SCRIPTS[@]}"; do
    # Wykonanie skryptu
    bash "$SCRIPT_PATH/$script" 2>/tmp/error.log
    # Sprawdzenie, czy skrypt zakończył się błędem
    if [ $? -ne 0 ]; then
        # Jeśli wystąpił błąd, przeczytaj i wyślij treść błędu w powiadomieniu e-mail
        MESSAGE=$(< /tmp/error.log)
        echo "Wystąpił problem podczas wykonania skryptu $script: $MESSAGE" | mail -s "$SUBJECT - $script" "$EMAIL"
    else
        # Informacja o pomyślnym wykonaniu skryptu
        echo "Skrypt $script został wykonany pomyślnie."
    fi
done

Sprawdzanie dostępności serwisów i ich restart

Skrypt sprawdza, czy określone serwisy są aktywne i uruchomione. Jeśli nie, próbuje je ponownie uruchomić.

#!/bin/bash

# Lista serwisów do sprawdzenia
services=("nginx" "mysql")

# Adres e-mail do powiadomień o błędach
EMAIL="admin@example.com"
SUBJECT="Problem z uruchomieniem serwisu"

# Iteracja przez listę serwisów
for service in "${services[@]}"; do
  # Sprawdzenie, czy serwis jest aktywny
  if systemctl is-active --quiet "$service"; then
    # Informacja, jeśli serwis jest już aktywny
    echo "Serwis $service jest aktywny."
  else
    # Próba uruchomienia serwisu, jeśli nie jest aktywny
    echo "Serwis $service nie jest aktywny. Próba uruchomienia..."
    systemctl start "$service" 2>/tmp/error.log
    # Sprawdzenie, czy uruchomienie serwisu się powiodło
    if [ $? -ne 0 ]; then
      # W przypadku błędu, wysyłanie powiadomienia e-mail z treścią błędu
      MESSAGE=$(< /tmp/error.log)
      echo "Nie udało się uruchomić serwisu $service: $MESSAGE" | mail -s "$SUBJECT - $service" "$EMAIL"
    else
      echo "Serwis $service został pomyślnie uruchomiony."
    fi
  fi
done

Zabezpieczanie plików dziennika

Archiwizuje i kompresuje pliki dziennika starsze niż 30 dni, aby zaoszczędzić miejsce na dysku, zachowując przy tym ważne informacje.

#!/bin/bash
log_dir="/var/log/myapp"
archive_dir="/var/log/myapp/archive"
mkdir -p "$archive_dir"
find "$log_dir" -type f -mtime +30 -name '*.log' -exec tar -zcvf "$archive_dir/archive-$(date +%Y-%m-%d).tar.gz" {} +
echo "Archiwizacja starych plików dziennika zakończona."

Monitorowanie użycia dysku

W tym skrypcie, jeśli użycie dysku przekroczy ustalony próg (max_usage), skrypt generuje ostrzeżenie i wysyła je na określony adres e-mail (admin@example.com) z użyciem polecenia mail. Tytuł wiadomości określony jest w zmiennej subject, a treść wiadomości tworzona jest dynamicznie w zależności od wyniku sprawdzenia.

#!/bin/bash
max_usage=90
email="admin@example.com"
subject="Ostrzeżenie o użyciu dysku"

for partition in $(df -h | awk '{print $5 " " $6}' | sed '1d' | awk '{print $2}'); do
  usage=$(df -h | grep "$partition" | awk '{print $5}' | sed 's/%//g')
  if [ "$usage" -gt "$max_usage" ]; then
    message="Uwaga: Partycja $partition jest zapełniona na $usage%."
    echo "$message" | mail -s "$subject" "$email"
  fi
done

Automatyczne tworzenie kopii zapasowych bazy danych MySQL

#!/bin/bash
db_name="nazwa_bazy"
backup_path="/backup/mysql"
date=$(date +%Y-%m-%d)
filename="$backup_path/$db_name-$date.sql"
email="admin@example.com"
subject="Błąd backupu bazy danych $db_name"

mysqldump -u username -p'password' $db_name > "$filename" 2>/tmp/error.log
if [ $? -eq 0 ]; then
  #echo "Backup bazy danych $db_name zakończony."
else
  message=$(cat /tmp/error.log)
  echo "$message" | mail -s "$subject" "$email"
fi

Sprawdzanie statusu serwera HTTP

#!/bin/bash

# Adres URL serwisu do sprawdzenia
url="http://twojastrona.com"

# Dane do wysyłki e-maila w przypadku wykrycia problemu
email="admin@example.com"
subject="Problem z serwerem HTTP"

# Użycie narzędzia curl do sprawdzenia statusu HTTP serwisu
# -o przekierowuje wyjście do /dev/null (ignoruje dane wyjściowe)
# -s oznacza tryb 'silent' czyli bez wyświetlania paska postępu i błędów
# -w pozwala na wyświetlenie tylko kodu statusu HTTP
status_code=$(curl -o /dev/null -s -w "%{http_code}\n" $url)

# Sprawdzenie, czy kod statusu jest różny od 200
if [ "$status_code" -ne 200 ]; then
  # Przygotowanie i wysyłka wiadomości e-mail z użyciem narzędzia mail
  # w przypadku, gdy status strony jest inny niż 200 (OK)
  message="Problem z serwerem HTTP, kod odpowiedzi: $status_code"
  echo "$message" | mail -s "$subject" "$email"
fi

Sprawdzanie statusu serwera SMTP

#!/bin/bash

# Konfiguracja
SMTP_SERVER="adres_serwera_smtp"
SMTP_PORT=25
TEST_EMAIL="admin@example.com"
SUBJECT="Problem z serwerem SMTP"
MESSAGE="Nie można połączyć się z serwerem SMTP: $SMTP_SERVER na porcie $SMTP_PORT"
MAIL_CMD="mail -s \"$SUBJECT\" $TEST_EMAIL"

# Próba połączenia z serwerem SMTP za pomocą nc (netcat)
echo "QUIT" | nc -w 5 $SMTP_SERVER $SMTP_PORT > /dev/null 2>&1

# Sprawdzenie wyniku próby połączenia
if [ $? -ne 0 ]; then
    # Jeśli połączenie nie powiodło się, wyślij powiadomienie e-mail
    echo "$MESSAGE" | eval $MAIL_CMD
else
    echo "Połączenie z serwerem SMTP: $SMTP_SERVER na porcie $SMTP_PORT zakończone sukcesem."
fi

Oczyszczanie katalogu tymczasowego

#!/bin/bash
tmp_dir="/tmp"
days=7
email="admin@example.com"
subject="Błąd przy czyszczeniu katalogu tymczasowego"

find $tmp_dir -type f -mtime +$days -exec rm -f {} \; 2>/tmp/error.log
if [ $? -ne 0 ]; then
  message=$(cat /tmp/error.log)
  echo "$message" | mail -s "$subject" "$email"
else
  echo "Oczyszczono katalog tymczasowy."
fi

Skrypt do automatycznego backupu wolumenów Dockera

#!/bin/bash

# Ustawienia
BACKUP_PATH="/path/to/backup/folder"
VOLUME_NAME="nazwa_wolumenu_do_backupu"
DATE=$(date +%Y-%m-%d)
BACKUP_FILENAME="backup_$VOLUME_NAME_$DATE.tar.gz"

# Tworzenie backupu
docker run --rm -v $VOLUME_NAME:/volume -v $BACKUP_PATH:/backup alpine tar czf /backup/$BACKUP_FILENAME /volume

echo "Backup wolumenu $VOLUME_NAME zakończony. Plik: $BACKUP_PATH/$BACKUP_FILENAME"

Monitorowanie zużycia pamięci przez usługę

#!/bin/bash

# Nazwa usługi do monitorowania
SERVICE_NAME="nginx"
# Próg zużycia pamięci (w MB)
MEMORY_THRESHOLD=500
# Adres e-mail do powiadomień
EMAIL="admin@example.com"

# Pobranie zużycia pamięci przez usługę
MEMORY_USAGE=$(ps aux | grep $SERVICE_NAME | awk '{sum+=$6} END {print sum / 1024}')

# Sprawdzenie, czy zużycie pamięci przekracza próg
if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" |bc -l) )); then
  echo "Usługa $SERVICE_NAME przekroczyła próg zużycia pamięci: ${MEMORY_USAGE}MB" | mail -s "Problem z zużyciem pamięci $SERVICE_NAME" "$EMAIL"
fi

Monitorowanie czasu działania usługi

#!/bin/bash

# Nazwa usługi do monitorowania
SERVICE="nginx"
# Adres e-mail do powiadomień
EMAIL="admin@example.com"

# Pobranie czasu działania usługi w sekundach
UPTIME=$(systemctl show -p ActiveEnterTimestamp $SERVICE | cut -d'=' -f2 | xargs -I{} date -d {} +%s)
CURRENT_TIME=$(date +%s)

# Obliczenie różnicy czasu
DIFF=$(( (CURRENT_TIME - UPTIME) / 60 )) # Różnica w minutach

# Sprawdzenie, czy usługa została uruchomiona w ciągu ostatnich 5 minut
if [ "$DIFF" -le 5 ]; then
  echo "Usługa $SERVICE została uruchomiona w ciągu ostatnich $DIFF minut." | mail -s "Restart usługi $SERVICE" "$EMAIL"
fi