TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

Anatomie eines guten Bash-Installationsskripts

May 30, 2021

Installationsskripte, die oft über curl ... | bash ausgeführt werden, sind ein gängiger Weg, um Software auf Linux- und macOS-Systemen zu verteilen. Ein gut geschriebenes Skript sollte robust, sicher und benutzerfreundlich sein.

Diese Anleitung analysiert die Anatomie solcher Skripte und hebt bewährte Methoden hervor, die man aus professionellen Beispielen lernen kann.


Beispiele aus der Praxis


Kernkomponenten eines robusten Installationsskripts

1. Strikter Modus (set -euo pipefail)

Jedes gute Skript beginnt mit dem "strict mode", um unvorhergesehenes Verhalten zu verhindern.

code
set -euo pipefail
  • -e: Beendet das Skript sofort, wenn ein Befehl fehlschlägt.
  • -u: Behandelt die Verwendung nicht deklarierter Variablen als Fehler.
  • -o pipefail: Lässt eine Pipeline fehlschlagen, wenn ein Befehl darin fehlschlägt, nicht nur der letzte.

2. Überprüfung der Root-Rechte

Das Skript sollte prüfen, ob es die notwendigen Rechte hat, und den Benutzer ggf. zur Eingabe des sudo-Passworts auffordern.

code
if [ "$EUID" -ne 0 ]; then
  echo "Dieses Skript erfordert Root-Rechte. Fordere sudo-Passwort an..."
  # Führe sudo aus, um das Passwort frühzeitig abzufragen
  sudo -v
  # Halte die sudo-Sitzung im Hintergrund am Leben
  while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
fi

3. Betriebssystem- und Architekturerkennung

Das Skript muss das Betriebssystem und die CPU-Architektur erkennen, um die korrekte Binärdatei herunterzuladen.

code
OS="$(uname -s | tr '[:upper:]' '[:lower:]')"
ARCH="$(uname -m)"

case "$OS" in
  linux)
    # ... Logik für Linux ...
    ;;
  darwin)
    # ... Logik für macOS ...
    ;;
  *)
    echo "Fehler: Nicht unterstütztes Betriebssystem: $OS" >&2
    exit 1
    ;;
esac

4. Überprüfung von Abhängigkeiten

Vor der Installation sollte geprüft werden, ob alle notwendigen Werkzeuge (wie curl, git, tar) vorhanden sind.

code
require_command() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "Fehler: Das erforderliche Programm '$1' ist nicht installiert." >&2
    exit 1
  fi
}

require_command curl
require_command git

5. Sicherer Download und Verifizierung

Dateien sollten über HTTPS heruntergeladen und ihre Integrität mittels einer Checksumme (SHA256) überprüft werden.

code
RELEASE_URL="https://example.com/myapp.tar.gz"
CHECKSUM_URL="https://example.com/myapp.sha256"

curl -fsSL "$RELEASE_URL" -o myapp.tar.gz
curl -fsSL "$CHECKSUM_URL" -o myapp.sha256

# Vergleiche die heruntergeladene Checksumme mit der berechneten
sha256sum --check myapp.sha256

6. Saubere Installation und Deinstallation

  • Installation: Dateien sollten an standardkonforme Orte installiert werden (z.B. /usr/local/bin).
  • Cleanup: Temporäre Download-Dateien sollten nach der Installation entfernt werden.
  • Deinstallations-Skript: Ein gutes Installationsprogramm bietet auch eine Möglichkeit zur sauberen Deinstallation.

7. Klare Ausgaben und Fehlerbehandlung

Das Skript sollte den Benutzer über seine Schritte informieren und bei Fehlern aussagekräftige Meldungen ausgeben.

code
echo "Lade die neueste Version herunter..."
# ... Befehl ...
echo "Installation abgeschlossen."

Das Sicherheitsrisiko von curl | bash

Der Befehl curl -sSL https://example.com/install.sh | sudo bash ist zwar bequem, aber potenziell unsicher. Er führt ein Skript direkt aus dem Internet mit Root-Rechten aus, ohne dass Sie die Möglichkeit haben, den Inhalt vorher zu überprüfen. Ein Angreifer, der den Server kompromittiert, könnte bösartigen Code einschleusen.

Sicherere Alternative:

  1. Herunterladen:
    code
    curl -fsSL https://get.docker.com/ -o get-docker.sh
    
  2. Überprüfen (optional, aber empfohlen): Öffnen Sie die Datei get-docker.sh in einem Editor und überprüfen Sie den Inhalt auf verdächtige Befehle.
    code
    less get-docker.sh
    
  3. Ausführen:
    code
    sudo sh get-docker.sh
    

Fazit

Die Analyse professioneller Installationsskripte zeigt eine Reihe von Mustern, die die Robustheit, Sicherheit und Benutzerfreundlichkeit erhöhen. Durch die Implementierung von Fehlerprüfungen, Abhängigkeits-Checks und sicheren Download-Praktiken können Sie vertrauenswürdige Installationsprozesse für Ihre eigene Software schaffen.