rz_diagnose.sh – RZ Admin Diagnose-Script

Automatisches System-Diagnose-Script für Rechenzentrum-Administratoren.
Prüft 8 kritische Systembereiche und gibt farbigen, strukturierten Output.


Installation

# Script kopieren und ausführbar machen
cp rz_diagnose.sh /usr/local/sbin/rz_diagnose.sh
chmod +x /usr/local/sbin/rz_diagnose.sh

# Optional: Als symlink global verfügbar
ln -s /usr/local/sbin/rz_diagnose.sh /usr/local/bin/rz_diagnose

Voraussetzungen:
- bash >= 4.0
- bc (float-Arithmetik) – meist vorinstalliert
- ps, df, awk, grep – Standardtools

Empfohlene Zusatzpakete:

# Debian/Ubuntu
apt install sysstat fail2ban bc

# RHEL/Rocky
dnf install sysstat fail2ban bc

# Arch
pacman -S sysstat fail2ban bc

Flags

Flag Kurz Beschreibung
--quiet -q Nur Warnungen und kritische Meldungen
--json -j JSON-Output für Monitoring-Integration
--check NAME -c Einzelner Check
--help -h Hilfe anzeigen

Verfügbare Check-Namen: disk load mysql ssh io mem fail2ban eol


Verwendung

# Alle Checks (Standard)
rz_diagnose.sh

# Nur Probleme anzeigen
rz_diagnose.sh --quiet

# JSON für Zabbix/Nagios/Checkmk
rz_diagnose.sh --json

# Einzelner Check
rz_diagnose.sh --check disk
rz_diagnose.sh --check mysql
rz_diagnose.sh --check ssh

# In Cron (täglich, nur bei Problemen mailen)
0 6 * * * /usr/local/sbin/rz_diagnose.sh --quiet 2>&1 | mail -s "RZ Diagnose $(hostname)" admin@example.com

Exit-Codes

Code Bedeutung
0 Alles OK
1 Mindestens eine Warnung
2 Mindestens ein kritischer Befund

Geprüfte Bereiche

1. DISK – /var Auslastung

  • Warnung bei >80%, Kritisch bei >90%
  • Bei Treffer: Top-10 Verzeichnisse nach Größe

2. LOAD – CPU-Last

  • Warnung bei >1.5x CPU-Kerne, Kritisch bei >3x
  • %iowait via vmstat oder iostat separat angezeigt

3. MYSQL – Datenbankstatus

  • Nur wenn MySQL/MariaDB läuft
  • Queries >30s aus PROCESSLIST
  • Threads_connected vs max_connections
  • Slow Query Log Status

Sicherheit: MySQL-Zugriff ausschließlich via Socket-Auth.
Kein Passwort im Script. Für passwortlosen Zugriff ~/.my.cnf anlegen:
ini [client] user=monitoring password=sicher123

4. SSH – Angriffe & Logins

  • Fehlgeschlagene Logins letzte Stunde: Warn >100, Kritisch >1000
  • Top-5 Angreifer-IPs
  • Erfolgreiche Logins (immer kritisch angezeigt zur manuellen Prüfung)
  • fail2ban-Status inkl. gebannte IPs

5. IO – Festplatten-Auslastung

  • iostat -dx (sysstat erforderlich)
  • Warnung bei %util >80%

6. MEMORY – RAM & Swap

  • Swap-Nutzung: Warnung >20%, Kritisch >60%
  • Top-5 RAM-Verbraucher via ps

7. FAIL2BAN – Einbruchsschutz

  • Installiert und aktiv?
  • Alle Jails mit Anzahl gebannter IPs

8. EOL – End-of-Life Versionen

Software EOL-Datum
PHP 7.2 November 2020
PHP 7.4 November 2022
PHP 8.0 November 2023
PHP 8.1 Dezember 2024
MySQL 5.7 Oktober 2023
MySQL 8.0 April 2026 (bald)

Distro-Unterstützung

System Log-Quelle Init-System
Debian/Ubuntu auth.log, journalctl systemd
RHEL/Rocky/CentOS /var/log/secure, journalctl systemd
Arch Linux journalctl systemd
FreeBSD /var/log/auth.log, service RC (kein systemctl/journalctl)

Beispiel-Output

RZ-Diagnose – webserver01 – 2026-03-28 10:15:42
Distro: Ubuntu 22.04.3 LTS | Familie: debian

── DISK – /var Auslastung ──
✓  /var Auslastung: 34% – OK

── LOAD – CPU-Last ──
ℹ  CPU-Kerne: 4 | Load: 0.42 / 0.38 / 0.31 (1/5/15 min)
✓  Load 0.42 – OK (Kerne: 4, Warn-Schwelle: 6.0)
ℹ  %iowait: 1%

── MYSQL – Datenbankstatus ──
ℹ  MySQL/MariaDB läuft
✓  Keine Queries >30s
ℹ  Verbindungen: 12 / 151 (7%)
✓  Slow Query Log: aktiv

── SSH – Angriffe & Logins ──
⚠  Fehlgeschlagene SSH-Logins (letzte Stunde): 247 – WARNUNG
ℹ  Top-5 Angreifer-IPs:
ℹ    89 203.0.113.42
ℹ    71 198.51.100.7
ℹ    45 192.0.2.99
ℹ    23 203.0.113.11
ℹ     19 198.51.100.44
✓  Erfolgreiche Logins (letzte Stunde): 0 – OK
✓  fail2ban: aktiv | sshd gebannte IPs: 14

── IO – Festplatten-Auslastung ──
✓    sda: %util=3.2% – OK
✓    sdb: %util=0.8% – OK

── MEMORY – RAM & Swap ──
✓  Swap-Nutzung: 4% – OK
ℹ  Top-5 RAM-Verbraucher:
ℹ    mysql     12.3%  /usr/sbin/mysqld
ℹ    php-fpm    4.1%  php-fpm: pool www
ℹ    nginx      1.2%  nginx: worker process
ℹ    redis      0.8%  /usr/bin/redis-server
ℹ    sshd       0.1%  sshd: /usr/sbin/sshd

── FAIL2BAN – Einbruchsschutz ──
✓  fail2ban: aktiv
ℹ  Aktive Jails:
ℹ    sshd: 14 gebannte IP(s)
ℹ    nginx-http-auth: 2 gebannte IP(s)

── EOL – End-of-Life Versionen ──
ℹ  PHP-Version: 7.4.33
✗  PHP 7.4.33 – EOL seit November 2022!
ℹ  MySQL-Version: 8.0.35
⚠  MySQL 8.0 – EOL April 2026 (bald)

════════════════════════════════════════
 ZUSAMMENFASSUNG – webserver01 – 2026-03-28 10:15:44
════════════════════════════════════════
  Checks gesamt : 8
  OK            : 5
  Warnungen     : 2
  Kritisch      : 1

Gefundene Probleme:
  WARN  SSH: 247 fehlgeschlagene Logins in 1h
  WARN  EOL: MySQL 8.0.35 (EOL Apr 2026)
  CRIT  EOL: PHP 7.4.33 (EOL Nov 2022)
════════════════════════════════════════

JSON-Output (für Monitoring)

rz_diagnose.sh --json
{
  "timestamp": "2026-03-28T09:15:42Z",
  "hostname": "webserver01",
  "checks": {
    "disk": {"status": "ok", "message": "/var 34% voll", "details": [...]},
    "load": {"status": "ok", "message": "load1=0.42 cores=4", "details": [...]},
    "mysql": {"status": "ok", "message": "MySQL OK", "details": [...]},
    "ssh": {"status": "info", "message": "failed=247 success=0", "details": [...]},
    "io": {"status": "ok", "message": "IO unauffällig", "details": [...]},
    "memory": {"status": "ok", "message": "Memory OK", "details": [...]},
    "fail2ban": {"status": "ok", "message": "fail2ban aktiv", "details": [...]},
    "eol": {"status": "critical", "message": "EOL-Versionen gefunden", "details": [...]}
  },
  "summary": {
    "total": 8,
    "ok": 5,
    "warn": 2,
    "crit": 1
  }
}

Monitoring-Integration

Nagios / Icinga / Checkmk

# check_command in commands.cfg
define command {
    command_name  check_rz_diagnose
    command_line  /usr/local/sbin/rz_diagnose.sh --quiet
}

Exit-Code 0/1/2 entspricht Nagios OK/WARNING/CRITICAL.

Zabbix (UserParameter)

# zabbix_agentd.conf
UserParameter=rz.diagnose.json,/usr/local/sbin/rz_diagnose.sh --json
UserParameter=rz.diagnose.exitcode,/usr/local/sbin/rz_diagnose.sh --quiet; echo $?

Cron-Job

# Täglich um 06:00, nur bei Problemen mailen
0 6 * * * /usr/local/sbin/rz_diagnose.sh --quiet && true || \
  /usr/local/sbin/rz_diagnose.sh --quiet 2>&1 | \
  mail -s "[$(hostname)] RZ Diagnose: Probleme gefunden" admin@example.com

Sicherheitshinweise

  • Nur lesende Befehle – keine Systemveränderungen
  • MySQL ohne Passwort – Socket-Auth via ~/.my.cnf oder root-Socket
  • Kein sudo erforderlich – einige Checks liefern bei fehlenden Rechten weniger Detail
  • Für vollständige SSH-Log-Auswertung: Script als root oder Mitglied der adm-Gruppe ausführen

Erstellt für den ozmai #klassiker – RZ-Admin Toolbox