• nap,
  • Óra,
  • Perc,
  • Másodperc

Bash szkriptelés a rendszeradminisztráció automatizálásához

Bash szkriptelés a rendszeradminisztráció automatizálásához

Bevezetés

A rendszeradminisztrátorok munkájának egyik legfontosabb aspektusa az ismétlődő feladatok automatizálása. A Linux rendszerekben a Bash (Bourne Again SHell) szkriptek készítése az egyik legelterjedtebb módja ennek. Ez a cikk bemutatja a Bash szkriptelés alapjait és gyakorlati példákat nyújt rendszeradminisztrációs feladatok automatizálására.

Bash szkriptelés alapjai

Az első szkript létrehozása

A Bash szkript egy egyszerű szöveges fájl, amely Bash parancsokat tartalmaz. Kezdjük egy alapvető példával:

#!/bin/bash

# Ez egy egyszerű Bash szkript
echo "Hello, rendszeradminisztrátor!"

A szkript futtatásához először futtatási jogot kell adnunk:

chmod +x hello.sh
./hello.sh

Változók és paraméterek

A változók lehetővé teszik értékek tárolását és újra felhasználását:

#!/bin/bash

# Változó definiálása
USERNAME="admin"
echo "Üdvözlöm, $USERNAME!"

# Parancsvégrehajtás eredményének tárolása változóban
CURRENT_DIR=$(pwd)
echo "Jelenlegi könyvtár: $CURRENT_DIR"

Szkript paramétereinek használata:

#!/bin/bash

# Paraméterek elérése
echo "Szkript neve: $0"
echo "Első paraméter: $1"
echo "Második paraméter: $2"
echo "Összes paraméter: $@"
echo "Paraméterek száma: $#"

Feltételes utasítások

Az if utasítások lehetővé teszik a döntések meghozatalát:

#!/bin/bash

# Paraméter ellenőrzése
if [ $# -eq 0 ]; then
    echo "Hiba: Nincs megadva paraméter!"
    exit 1
fi

# Fájl létezésének ellenőrzése
if [ -f "$1" ]; then
    echo "$1 fájl létezik."
else
    echo "$1 fájl nem létezik."
fi

Ciklusok

Ismétlődő feladatok végrehajtásához:

#!/bin/bash

# For ciklus
echo "Számoljunk 1-től 5-ig:"
for i in {1..5}; do
    echo $i
done

# While ciklus
echo "Most visszafelé:"
count=5
while [ $count -gt 0 ]; do
    echo $count
    count=$((count-1))
done

Függvények

A függvények segítségével újrafelhasználható kódrészleteket készíthetünk:

#!/bin/bash

# Függvény definiálása
function log_message {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1"
}

# Függvény használata
log_message "Szkript indítása"
echo "Feladat végrehajtása..."
log_message "Szkript befejezése"

Fájlkezelés és rendszerkarbantartás

Régi fájlok tisztítása

Ez a szkript megkeresi és törli a 30 napnál régebbi fájlokat egy adott könyvtárban:

#!/bin/bash

# Biztonsági ellenőrzés
if [ $# -ne 1 ] || [ ! -d "$1" ]; then
    echo "Használat: $0 /elérési/út/könyvtárhoz"
    exit 1
fi

TARGET_DIR="$1"
LOG_FILE="/var/log/cleanup_$(date +'%Y%m%d').log"

echo "Régi fájlok keresése és törlése a következő könyvtárban: $TARGET_DIR" | tee -a "$LOG_FILE"
echo "Kezdés időpontja: $(date)" | tee -a "$LOG_FILE"

find "$TARGET_DIR" -type f -mtime +30 -exec ls -lh {} \; | tee -a "$LOG_FILE"
find "$TARGET_DIR" -type f -mtime +30 -exec rm {} \;

echo "Befejezés időpontja: $(date)" | tee -a "$LOG_FILE"
echo "A tisztítás befejeződött. A részletek itt találhatók: $LOG_FILE"

Lemezhasználat figyelése

Szkript a kritikus lemezhasználat ellenőrzésére és riasztások küldésére:

#!/bin/bash

# Beállítások
THRESHOLD=90  # Riasztási küszöb százalékban
EMAIL="admin@example.com"
HOSTNAME=$(hostname)

# Ellenőrzés és riasztás
check_disk_usage() {
    df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 " " $6 }' | while read -r usage partition mountpoint; do
        usage_percent=$(echo "$usage" | cut -d'%' -f1)
        if [ "$usage_percent" -ge "$THRESHOLD" ]; then
            echo "RIASZTÁS: A $partition partíció ($mountpoint) $usage megtelt a $HOSTNAME szerveren!"
            return 1
        fi
    done
    return 0
}

# Főprogram
if ! check_disk_usage; then
    df -h | mail -s "Lemezhasználati riasztás - $HOSTNAME" "$EMAIL"
    echo "Lemezhasználati riasztás küldve: $(date)"
else
    echo "Minden lemezhasználat a küszöb alatt van: $(date)"
fi

Felhasználókezelés automatizálása

Tömeges felhasználó létrehozása

CSV fájlból több felhasználó hozzáadása a rendszerhez:

#!/bin/bash

# Ellenőrzés
if [ "$UID" -ne 0 ]; then
    echo "Ezt a szkriptet root jogosultsággal kell futtatni!"
    exit 1
fi

if [ $# -ne 1 ] || [ ! -f "$1" ]; then
    echo "Használat: $0 felhasznalok.csv"
    echo "CSV formátum: felhasználónév,teljes név,csoport,jelszó"
    exit 1
fi

# Felhasználók létrehozása
while IFS=, read -r username fullname group password; do
    # Ellenőrzés, hogy a felhasználó létezik-e
    if id "$username" &>/dev/null; then
        echo "A felhasználó már létezik: $username - kihagyva"
        continue
    fi
    
    # Csoport létrehozása, ha nem létezik
    if ! getent group "$group" &>/dev/null; then
        groupadd "$group"
        echo "Csoport létrehozva: $group"
    fi
    
    # Felhasználó létrehozása
    useradd -m -c "$fullname" -g "$group" "$username"
    echo "$username:$password" | chpasswd
    echo "Felhasználó létrehozva: $username ($fullname)"
done < "$1"

echo "Felhasználók létrehozása befejeződött."

Inaktív felhasználók keresése

Régóta inaktív felhasználói fiókok azonosítása:

#!/bin/bash

# Beállítások
DAYS=90  # Inaktivitási időszak napokban

# Inaktív felhasználók keresése
echo "Felhasználók, akik több mint $DAYS napja nem jelentkeztek be:"
echo "------------------------------------------------------------"
echo "FELHASZNÁLÓNÉV      UTOLSÓ BEJELENTKEZÉS"
echo "------------------------------------------------------------"

lastlog | tail -n +2 | while read -r line; do
    username=$(echo "$line" | awk '{print $1}')
    last_login=$(echo "$line" | grep -oP "(?<=:).*" | sed 's/^[ \t]*//')
    
    if [[ "$last_login" == *"**Never logged in**"* ]]; then
        echo "$username           Soha nem jelentkezett be"
    else
        last_login_date=$(echo "$line" | grep -oP "\w+\s+\d+\s+\d+")
        days_since=$(( ( $(date +%s) - $(date -d "$last_login_date" +%s) ) / 86400 ))
        
        if [ "$days_since" -gt "$DAYS" ]; then
            echo "$username           $last_login ($days_since napja)"
        fi
    fi
done

Rendszermonitorozás szkriptekkel

Rendszererőforrások figyelése

A következő szkript figyeli a CPU, memória és swap használatot:

#!/bin/bash

# Beállítások
LOG_DIR="/var/log/system_monitor"
LOG_FILE="$LOG_DIR/$(date +'%Y%m%d').log"

# Log könyvtár létrehozása, ha nem létezik
mkdir -p "$LOG_DIR"

# Időbélyeg
timestamp() {
    date +'%Y-%m-%d %H:%M:%S'
}

# Rendszerinformációk gyűjtése
echo "===== Rendszermonitor jelentés $(timestamp) =====" >> "$LOG_FILE"

# CPU információk
echo "CPU használat:" >> "$LOG_FILE"
top -bn1 | grep "Cpu(s)" >> "$LOG_FILE"

# Memória információk
echo -e "\nMemória használat:" >> "$LOG_FILE"
free -h >> "$LOG_FILE"

# Lemezhasználat
echo -e "\nLemezhasználat:" >> "$LOG_FILE"
df -h >> "$LOG_FILE"

# Top 5 CPU-intenzív folyamat
echo -e "\nTop 5 CPU-intenzív folyamat:" >> "$LOG_FILE"
ps aux --sort=-%cpu | head -n 6 >> "$LOG_FILE"

# Top 5 memória-intenzív folyamat
echo -e "\nTop 5 memória-intenzív folyamat:" >> "$LOG_FILE"
ps aux --sort=-%mem | head -n 6 >> "$LOG_FILE"

echo -e "\n------------------------------------------\n" >> "$LOG_FILE"
echo "Monitorozási adatok rögzítve: $LOG_FILE"

Szolgáltatások állapotának ellenőrzése

Kritikus szolgáltatások állapotának figyelése és újraindítása hiba esetén:

#!/bin/bash

# Figyelendő szolgáltatások listája
SERVICES=("nginx" "mysql" "ssh" "apache2")
LOG_FILE="/var/log/service_monitor.log"

# Log funkció
log_message() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    echo "$1"
}

# Szolgáltatások ellenőrzése
for service in "${SERVICES[@]}"; do
    if systemctl is-active --quiet "$service"; then
        log_message "$service fut megfelelően."
    else
        log_message "HIBA: $service nem fut! Újraindítás..."
        systemctl restart "$service"
        
        # Ellenőrzés újraindítás után
        sleep 5
        if systemctl is-active --quiet "$service"; then
            log_message "$service sikeresen újraindítva."
        else
            log_message "KRITIKUS HIBA: $service újraindítása sikertelen!"
            # Itt küldhetnénk e-mail értesítést az adminisztrátornak
        fi
    fi
done

Biztonsági mentések automatizálása

Egyszerű adatbázis-mentés

MySQL/MariaDB adatbázisok biztonsági mentése:

#!/bin/bash

# Beállítások
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +'%Y%m%d')
MYSQL_OPTS="--single-transaction --quick --lock-tables=false"

# Biztonsági mentés könyvtár létrehozása
mkdir -p "$BACKUP_DIR/$DATE"

# Adatbázisok listázása
databases=$(mysql -u "$DB_USER" -p"$DB_PASS" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql)")

# Adatbázisok mentése
for db in $databases; do
    echo "Mentés készítése: $db"
    mysqldump -u "$DB_USER" -p"$DB_PASS" $MYSQL_OPTS "$db" | gzip > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

# Régi mentések törlése (30 napnál régebbi)
find "$BACKUP_DIR" -type d -mtime +30 -exec rm -rf {} \; 2>/dev/null || true

echo "Adatbázis mentés befejezve: $(date +'%Y-%m-%d %H:%M:%S')"

Inkrementális fájlrendszer mentés

Az rsync használatával inkrementális mentés készítése:

#!/bin/bash

# Beállítások
SOURCE_DIR="/var/www"
BACKUP_DIR="/backup"
DATETIME=$(date +'%Y-%m-%d_%H%M%S')
LATEST_LINK="$BACKUP_DIR/latest"

# Ellenőrzés
if [ ! -d "$SOURCE_DIR" ]; then
    echo "Forrás könyvtár nem létezik: $SOURCE_DIR"
    exit 1
fi

mkdir -p "$BACKUP_DIR"

# Backup készítése rsync segítségével
if [ -d "$LATEST_LINK" ]; then
    rsync -avz --delete \
        --link-dest="$LATEST_LINK" \
        "$SOURCE_DIR/" \
        "$BACKUP_DIR/backup_$DATETIME/"
else
    rsync -avz --delete \
        "$SOURCE_DIR/" \
        "$BACKUP_DIR/backup_$DATETIME/"
fi

# Update the "latest" symlink
rm -f "$LATEST_LINK"
ln -s "$BACKUP_DIR/backup_$DATETIME" "$LATEST_LINK"

echo "Backup kész: $BACKUP_DIR/backup_$DATETIME"

Hasznos gyakorlati példák

Logfájlok elemzése

Webes hozzáférési naplók elemzése a legtöbb lekérést küldő IP-címek azonosításához:

#!/bin/bash

# Beállítások
LOG_FILE="/var/log/nginx/access.log"
RESULTS=10

if [ ! -f "$LOG_FILE" ]; then
    echo "Hiba: $LOG_FILE nem található!"
    exit 1
fi

echo "Top $RESULTS IP cím a következő naplófájlban: $LOG_FILE"
echo "-----------------------------------------------------"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n "$RESULTS"

echo -e "\nTop $RESULTS böngészett oldal:"
echo "-----------------------------------------------------"
awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n "$RESULTS"

echo -e "\nHTTP státuszkódok megoszlása:"
echo "-----------------------------------------------------"
awk '{print $9}' "$LOG_FILE" | sort | uniq -c | sort -nr

Automatikus SSL tanúsítvány megújítás

Let's Encrypt tanúsítványok automatikus megújítása és webszerver újraindítása:

#!/bin/bash

# Beállítások
DOMAINS=("example.com" "www.example.com")
EMAIL="admin@example.com"
WEBROOT="/var/www/html"
LOG_FILE="/var/log/letsencrypt_renew.log"

# Log funkció
log_message() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    echo "$1"
}

# Domain lista összeállítása
DOMAIN_ARGS=""
for domain in "${DOMAINS[@]}"; do
    DOMAIN_ARGS="$DOMAIN_ARGS -d $domain"
done

# Tanúsítvány megújítása
log_message "SSL tanúsítvány megújítási kísérlet..."
certbot renew --webroot -w "$WEBROOT" $DOMAIN_ARGS --email "$EMAIL" --quiet

# Ellenőrzés és újraindítás
if [ $? -eq 0 ]; then
    log_message "Tanúsítvány megújítása sikeres, webszerver újraindítása..."
    systemctl restart nginx
    if [ $? -eq 0 ]; then
        log_message "Webszerver újraindítása sikeres."
    else
        log_message "HIBA: Webszerver újraindítása sikertelen!"
    fi
else
    log_message "HIBA: Tanúsítvány megújítása sikertelen!"
fi

Rendszerterhelés figyelése és értesítés

Rendszerterhelés (load average) figyelése és riasztás küldése túl magas érték esetén:

#!/bin/bash

# Beállítások
THRESHOLD=5.0
EMAIL="admin@example.com"
HOSTNAME=$(hostname)
LOG_FILE="/var/log/load_monitor.log"

# Log funkció
log_message() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE"
    echo "$1"
}

# Aktuális terhelés lekérdezése
LOAD=$(uptime | awk '{print $(NF-2)}' | tr -d ',')

# Összehasonlítás a küszöbértékkel
if (( $(echo "$LOAD > $THRESHOLD" | bc -l) )); then
    log_message "RIASZTÁS: A rendszerterhelés ($LOAD) meghaladta a küszöbértéket ($THRESHOLD)!"
    
    # Top folyamatok összegyűjtése
    PROCESSES=$(ps aux --sort=-%cpu | head -n 6)
    
    # Email küldése
    {
        echo "Tárgy: Rendszerterhelési riasztás - $HOSTNAME"
        echo "From: System Monitor <noreply@$HOSTNAME>"
        echo "To: $EMAIL"
        echo "Content-Type: text/plain"
        echo ""
        echo "Magas rendszerterhelés észlelve a következő szerveren: $HOSTNAME"
        echo "Idő: $(date)"
        echo "Aktuális terhelés: $LOAD (küszöb: $THRESHOLD)"
        echo ""
        echo "Top CPU-használó folyamatok:"
        echo "$PROCESSES"
    } | sendmail -t
    
    log_message "Értesítés elküldve: $EMAIL"
else
    log_message "A rendszerterhelés normális szinten van: $LOAD"
fi

Összefoglalás

A Bash szkriptelés hatékony eszköz a rendszeradminisztrátorok kezében az ismétlődő feladatok automatizálására. Ebben a cikkben bemutattuk a Bash szkriptek alapjait és számos gyakorlati példát különböző rendszeradminisztrációs feladatok automatizálására.

A szkriptek következetes használatával:

  • Csökkenthető az emberi hibák száma
  • Időt takaríthatunk meg a rutin feladatokon
  • Következetes és dokumentált folyamatokat építhetünk
  • Nagyobb skálán kezelhetjük rendszereinket

A cikkben bemutatott példák kiindulópontként szolgálhatnak saját automatizálási megoldások fejlesztéséhez. Javasolt a szkriptek alapos tesztelése nem-kritikus környezetben, mielőtt éles rendszereken alkalmaznánk őket.

  • 0 A felhasználók hasznosnak találták ezt
  • bash, szkript, fájlkezelés, hasznos gyakorlati példák, biztonsági mentések automatizálása
Hasznosnak találta ezt a választ?

Kapcsolódó cikkek

Hogyan telepítsünk TeamSpeak 3 szerver Linuxon

Mi is az a Team Speak? Ha még nem tudod, hogy mi is pontosan a Team Speak vagy ismertebb nevén...

Docker konténerek bevezetése és gyakorlati alkalmazása

Docker konténerek bevezetése és gyakorlati alkalmazása Bevezetés A konténerizáció napjainkban...

Linux biztonsági alapok és jó gyakorlatok vállalati környezetben

Linux biztonsági alapok és jó gyakorlatok vállalati környezetben A Linux operációs rendszerek...

Linux szerverek teljesítmény-optimalizálása és monitorozása

Linux szerverek teljesítmény-optimalizálása és monitorozása Bevezetés A modern informatikai...