Einfache Administrationsskripte erstellen

ShellBeginner
Jetzt üben

Einführung

Systemadministratoren wandeln wiederkehrende Prüfungen häufig in kleine Shell-Skripte um. Beim Skripting im RHCSA-Stil geht es nicht darum, komplexe Programme zu schreiben. Vielmehr geht es darum, Bash sicher zu nutzen, um alltägliche Aufgaben zu automatisieren, Eingaben zu validieren, Ziele in Schleifen zu durchlaufen, nützliche Exit-Codes zurückzugeben und Ausgaben zu erzeugen, die auch für andere Administratoren leicht verständlich sind.

In diesem Lab erstellen Sie Schritt für Schritt ein Skript zur Zusammenfassung von Verzeichnisinhalten. Das Skript akzeptiert Verzeichnispfade, prüft die Nutzbarkeit der Pfade, sammelt grundlegende Dateiinformationen, schreibt eine lesbare Ausgabe und speichert diese zusätzlich in einer Protokolldatei.

Ein ausführbares Skript erstellen

In diesem Schritt untersuchen Sie die Beispielverzeichnisse und erstellen die erste ausführbare Version eines Administrationsskripts. Ein Skript sollte mit einem Shebang beginnen, damit das System weiß, welcher Interpreter verwendet werden soll.

Wechseln Sie in das Projektverzeichnis.

cd /home/labex/project

Untersuchen Sie die Beispielstruktur. Der Befehl find listet Dateien und Verzeichnisse auf, und sort sorgt für eine stabile Reihenfolge.

find /home/labex/project/script-practice -maxdepth 2 -print | sort

Erstellen Sie die erste Version von admin-summary.sh. Die Zeile #!/bin/bash weist Linux an, die Datei mit Bash auszuführen. Die Option set -u bewirkt, dass das Skript abbricht, wenn eine nicht definierte Variable verwendet wird, was viele Tippfehler abfängt.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"
EOF

Machen Sie das Skript ausführbar. Ohne Ausführungsberechtigung ist die Datei lediglich Text.

chmod 755 /home/labex/project/admin-summary.sh

Führen Sie das Skript aus.

/home/labex/project/admin-summary.sh

Sie sollten den Titel des Skripts, den aktuellen Benutzer und den Kurznamen des Hosts sehen. Der genaue Hostname kann variieren.

Verzeichnisargumente akzeptieren

In diesem Schritt fügen Sie positionale Parameter hinzu. Ein Skript verwendet $#, um die Anzahl der Argumente zu zählen, und "$@" repräsentiert alle Argumente exakt so, wie sie übergeben wurden.

Ersetzen Sie das Skript durch eine Version, die mindestens ein Verzeichnisargument erfordert.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

for target in "$@"; do
  echo "TARGET=$target"
done
EOF

Stellen Sie sicher, dass das Skript ausführbar bleibt.

chmod 755 /home/labex/project/admin-summary.sh

Führen Sie es ohne Argumente aus. Der Befehl sollte den Nutzungshinweis ausgeben und den Exit-Status 2 zurückgeben. Der Operator || führt den rechten Befehl nur dann aus, wenn der linke Befehl fehlschlägt, was es Ihnen ermöglicht, den Status ungleich Null gezielt anzuzeigen.

/home/labex/project/admin-summary.sh || echo "exit status: $?"

Führen Sie es nun mit zwei Verzeichnisargumenten aus.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs

Die Ausgabe sollte für jedes Argument eine TARGET=-Zeile enthalten.

Jedes Ziel testen und einen nützlichen Status zurückgeben

In diesem Schritt fügen Sie eine bedingte Prüfung für jedes Argument hinzu. Der Test [ -d "$target" ] ist nur dann erfolgreich, wenn der Pfad existiert und ein Verzeichnis ist.

Ersetzen Sie das Skript durch eine Version, die OK für Verzeichnisse und MISSING für alles andere meldet.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    echo "OK $target"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Führen Sie das Skript mit einem gültigen Verzeichnis aus. Der finale Exit-Status sollte 0 sein.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app
echo "exit status: $?"

Führen Sie es erneut mit einem nicht existierenden Verzeichnis aus. Diesmal sollte das Skript MISSING ausgeben und den Exit-Status 1 zurückgeben.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/missing || echo "exit status: $?"

Praktische Verzeichnisdaten sammeln

In diesem Schritt fügen Sie Befehlssubstitution hinzu. Die Befehlssubstitution führt einen Befehl innerhalb von $() aus und speichert dessen Ausgabe in einer Variablen.

Ersetzen Sie das Skript durch eine Version, die für jedes gültige Verzeichnis die Anzahl der Dateien, die scheinbare Größe und den Eigentümer meldet.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

if [ "$#" -eq 0 ]; then
  echo "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

echo "RHCSA admin summary"
echo "RUN_AS=$(id -un)"
echo "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    echo "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    echo "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Führen Sie das Skript für die drei vorbereiteten Verzeichnisse aus.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/cache

Das Verzeichnis app sollte FILES=3, logs sollte FILES=2 und cache sollte FILES=1 anzeigen.

Ausgabe in einer Protokolldatei speichern

In diesem Schritt fügen Sie eine kleine Hilfsfunktion und eine Protokolldatei hinzu. Eine Funktion vermeidet Code-Wiederholungen, und tee -a zeigt die Ausgabe an, während sie gleichzeitig an eine Datei angehängt wird.

Ersetzen Sie das Skript durch die finale Version.

cat > /home/labex/project/admin-summary.sh <<'EOF'
#!/bin/bash
set -u

LOG="/home/labex/project/admin-summary.log"
: > "$LOG"

emit() {
  echo "$*" | tee -a "$LOG"
}

if [ "$#" -eq 0 ]; then
  emit "Usage: $0 DIRECTORY [DIRECTORY...]"
  exit 2
fi

emit "RHCSA admin summary"
emit "RUN_AS=$(id -un)"
emit "HOST=$(hostname -s)"

exit_status=0

for target in "$@"; do
  if [ -d "$target" ]; then
    file_count="$(find "$target" -type f | wc -l)"
    size="$(du -sh "$target" | awk '{print $1}')"
    owner="$(stat -c '%U:%G' "$target")"
    emit "OK $target FILES=$file_count SIZE=$size OWNER=$owner"
  else
    emit "MISSING $target"
    exit_status=1
  fi
done

exit "$exit_status"
EOF

Führen Sie das finale Skript mit zwei gültigen Verzeichnissen und einem fehlenden Verzeichnis aus.

/home/labex/project/admin-summary.sh /home/labex/project/script-practice/app /home/labex/project/script-practice/logs /home/labex/project/script-practice/missing || echo "exit status: $?"

Überprüfen Sie das gespeicherte Protokoll.

sed -n '1,8p' /home/labex/project/admin-summary.log

Die Terminalausgabe und die Protokolldatei sollten dieselben Zusammenfassungszeilen enthalten. Da ein Ziel fehlt, sollte der Exit-Status 1 sein.

Zusammenfassung

Sie haben ein praktisches Bash-Administrationsskript erstellt. Sie haben einen Shebang, Ausführungsberechtigungen, positionale Parameter, Argumentzählungen, Schleifen, Verzeichnistests, Befehlssubstitution, explizite Exit-Status, eine Hilfsfunktion und eine Protokolldatei verwendet. Dies sind die Skripting-Muster, die für kleine Administrationsaufgaben im RHCSA-Stil am nützlichsten sind.