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
- Docker: get.docker.com
- Homebrew: install.sh
- nvm (Node Version Manager): install.sh
Kernkomponenten eines robusten Installationsskripts
1. Strikter Modus (set -euo pipefail)
Jedes gute Skript beginnt mit dem "strict mode", um unvorhergesehenes Verhalten zu verhindern.
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.
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.
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.
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.
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.
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:
- Herunterladen:
code
curl -fsSL https://get.docker.com/ -o get-docker.sh - Überprüfen (optional, aber empfohlen):
Öffnen Sie die Datei
get-docker.shin einem Editor und überprüfen Sie den Inhalt auf verdächtige Befehle.codeless get-docker.sh - 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.