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.