Linux Terminal-Grundlagen: Die wichtigsten Befehle für Einsteiger

Das Linux-Terminal wirkt auf Einsteiger oft einschüchternd: schwarzer Bildschirm, blinkender Cursor, kein Menü. Doch wer einmal verstanden hat, wie die Kommandozeile funktioniert, möchte sie nicht mehr missen. Das Terminal ist schneller als jede grafische Oberfläche, lässt sich automatisieren, funktioniert auf jedem Server der Welt und gibt dir die volle Kontrolle über dein System. In diesem Artikel lernst du die wichtigsten Befehle und Konzepte – mit vielen praktischen Beispielen.

Warum das Terminal so mächtig ist

Grafische Oberflächen sind bequem für alltägliche Aufgaben. Aber sobald du Aufgaben automatisieren, auf einem Remote-Server (ohne Desktop-Umgebung) arbeiten oder hunderte Dateien auf einmal verarbeiten willst, ist die GUI hoffnungslos unterlegen. Ein einziger Bash-Befehl kann in Sekunden erledigen, wofür du in einer GUI Minuten brauchst. Für Entwickler, Systemadministratoren und DevOps-Engineers ist das Terminal das primäre Arbeitsgerät – und ein Blick auf Servertechnik wie Proxmox zeigt, dass viele Verwaltungsaufgaben ausschließlich über die CLI laufen.

Das Dateisystem navigieren

Im Linux-Dateisystem gibt es keine Laufwerksbuchstaben wie unter Windows. Alles hängt an einem einzigen Wurzelverzeichnis: /. Von dort aus zweigen alle weiteren Verzeichnisse ab.

Grundlegende Navigationsbefehle

# Aktuelles Verzeichnis anzeigen (Print Working Directory)
pwd

# Verzeichnis wechseln
cd /var/log          # absoluter Pfad
cd ..                # ein Verzeichnis nach oben
cd ~                 # ins Home-Verzeichnis
cd -                 # zurück zum letzten Verzeichnis

# Verzeichnisinhalt anzeigen
ls                   # einfache Liste
ls -l                # Detailansicht (Rechte, Größe, Datum)
ls -la               # inklusive versteckter Dateien (Punkt-Dateien)
ls -lh               # menschenlesbare Größen (KB, MB, GB)

# Dateien und Verzeichnisse suchen
find /etc -name "*.conf"           # alle .conf-Dateien in /etc
find ~ -type f -newer /tmp/ref     # Dateien neuer als Referenzdatei
find . -size +10M                  # Dateien größer als 10 MB

Wichtige Verzeichnisse kennen

Dateien und Verzeichnisse verwalten

# Verzeichnis erstellen
mkdir mein-ordner
mkdir -p pfad/zu/tiefem/ordner    # alle Ebenen auf einmal

# Dateien kopieren und verschieben
cp datei.txt kopie.txt
cp -r ordner/ ziel/               # Verzeichnis rekursiv kopieren
mv alte-datei.txt neue-datei.txt  # umbenennen oder verschieben
mv datei.txt /tmp/                # in anderen Ordner verschieben

# Dateien löschen (VORSICHT: kein Papierkorb!)
rm datei.txt
rm -r ordner/                     # Verzeichnis rekursiv löschen
rm -rf ordner/                    # erzwingen, keine Rückfragen

# Leere Datei erstellen / Zeitstempel aktualisieren
touch neue-datei.txt

# Dateiinhalt anzeigen
cat datei.txt                     # gesamten Inhalt ausgeben
less datei.txt                    # seitenweise (q zum Beenden)
head -20 datei.txt                # erste 20 Zeilen
tail -20 datei.txt                # letzte 20 Zeilen
tail -f /var/log/syslog           # Live-Ansicht (folgt neuen Zeilen)

Dateiberechtigungen verstehen

Linux hat ein klares Rechtesystem: Jede Datei gehört einem Benutzer und einer Gruppe. Die Rechte werden in drei Kategorien aufgeteilt: Besitzer (u), Gruppe (g) und alle anderen (o).

# Berechtigungen anzeigen
ls -la
# Ausgabe: -rwxr-xr-- 1 arthur users 4096 Jun 12 10:00 skript.sh
#           ^^^ ^^^ ^^^
#           |   |   └─ andere: nur lesen
#           |   └───── gruppe: lesen + ausführen
#           └───────── besitzer: lesen + schreiben + ausführen

# Rechte ändern (symbolisch)
chmod u+x skript.sh          # Ausführrecht für Besitzer hinzufügen
chmod go-w datei.txt         # Schreibrecht für Gruppe und andere entfernen
chmod a+r datei.txt          # Leserecht für alle hinzufügen

# Rechte ändern (oktal – schneller für Erfahrene)
chmod 644 datei.txt          # rw-r--r-- (typisch für Dateien)
chmod 755 skript.sh          # rwxr-xr-x (typisch für ausführbare Dateien)
chmod 700 geheim/            # rwx------ (nur Besitzer)

# Besitzer ändern (als root)
chown arthur datei.txt
chown arthur:users datei.txt  # Besitzer und Gruppe ändern
chown -R arthur /var/www/     # rekursiv für ganze Verzeichnisse

Paketverwaltung

Je nach Linux-Distribution gibt es unterschiedliche Paketverwaltungssysteme:

# Debian / Ubuntu (apt)
sudo apt update                   # Paketlisten aktualisieren
sudo apt upgrade                  # installierte Pakete aktualisieren
sudo apt install nginx            # Paket installieren
sudo apt remove nginx             # Paket entfernen
sudo apt search python            # nach Paket suchen
apt show nginx                    # Paketinfo anzeigen

# Fedora / RHEL / CentOS (dnf)
sudo dnf update
sudo dnf install nginx
sudo dnf remove nginx

# Arch Linux / Manjaro (pacman)
sudo pacman -Syu                  # System aktualisieren
sudo pacman -S nginx              # installieren
sudo pacman -R nginx              # entfernen
pacman -Ss python                 # suchen

Prozesse verwalten

# Laufende Prozesse anzeigen
ps aux                            # alle Prozesse
ps aux | grep nginx               # nach Prozess filtern
top                               # interaktive Prozessliste
htop                              # verbesserte Version (muss ggf. installiert werden)

# Prozesse beenden
kill 1234                         # Prozess mit PID 1234 beenden (SIGTERM)
kill -9 1234                      # erzwingen (SIGKILL)
killall nginx                     # alle Prozesse mit diesem Namen beenden
pkill -f "python script.py"       # nach Befehlsmuster suchen und beenden

# Prozesse im Hintergrund
befehl &                          # im Hintergrund starten
jobs                              # laufende Hintergrundjobs anzeigen
fg 1                              # Job 1 in den Vordergrund bringen
nohup befehl &                    # läuft weiter, auch wenn Terminal geschlossen

# Systemd-Dienste verwalten
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl enable nginx       # beim Boot starten
sudo systemctl status nginx       # Status prüfen

Netzwerk-Befehle

# Konnektivität prüfen
ping google.com
ping -c 4 8.8.8.8                 # nur 4 Pakete senden

# Dateien herunterladen
curl https://example.com/datei.zip -o datei.zip
curl -I https://kotsch.tech       # nur HTTP-Header anzeigen
wget https://example.com/datei.zip

# Netzwerkschnittstellen
ip addr                           # IP-Adressen aller Interfaces
ip route                          # Routing-Tabelle

# Offene Ports / Verbindungen
ss -tulpn                         # alle lauschenden Ports
netstat -tulpn                    # ältere Alternative

# SSH – Fernzugriff
ssh [email protected]
ssh -p 2222 [email protected]        # alternativer Port
ssh -i ~/.ssh/mein_key user@host  # mit SSH-Key authentifizieren

# Dateien über SSH übertragen
scp datei.txt user@server:/tmp/
scp -r ordner/ user@server:~/backup/

Pipes und Umleitung

Pipes und Umleitungen sind das Herzstück der Unix-Philosophie: Kleine, spezialisierte Werkzeuge werden zu mächtigen Pipelines kombiniert.

# Ausgabe in Datei schreiben (überschreiben)
ls -la > liste.txt

# Ausgabe anhängen
echo "Neue Zeile" >> log.txt

# Fehler umleiten
befehl 2> fehler.txt
befehl > ausgabe.txt 2>&1        # stdout und stderr zusammen

# Pipe: Ausgabe als Eingabe für nächsten Befehl
ls -la | grep ".sh"              # nur .sh-Dateien anzeigen
cat /var/log/syslog | grep error | tail -50
ps aux | sort -k3 -rn | head -10 # Top 10 CPU-Fresser

# Nützliche Filter-Werkzeuge
grep "fehler" log.txt            # Zeilen mit "fehler"
grep -i "error" log.txt          # Groß-/Kleinschreibung ignorieren
grep -r "TODO" /var/www/         # rekursiv in Verzeichnis
wc -l datei.txt                  # Zeilen zählen
sort datei.txt                   # alphabetisch sortieren
uniq -c sortiert.txt             # Duplikate zählen
awk '{print $1}' datei.txt       # erste Spalte ausgeben
sed 's/alt/neu/g' datei.txt      # Text ersetzen

Einfache Bash-Scripts schreiben

Ein Bash-Script ist nichts anderes als eine Textdatei mit einer Folge von Befehlen. Du machst sie ausführbar und kannst sie beliebig oft aufrufen.

#!/bin/bash
# mein-script.sh – einfaches Beispiel

# Variablen
NAME="Welt"
echo "Hallo, $NAME!"

# Benutzerinput
read -p "Gib deinen Namen ein: " BENUTZERNAME
echo "Hallo, $BENUTZERNAME!"

# Bedingungen
if [ -f "/etc/nginx/nginx.conf" ]; then
    echo "Nginx ist installiert."
else
    echo "Nginx nicht gefunden."
fi

# Schleifen
for DATEI in /var/log/*.log; do
    echo "Verarbeite: $DATEI"
done

# Funktionen
backup() {
    DATUM=$(date +%Y-%m-%d)
    tar -czf "backup-$DATUM.tar.gz" "$1"
    echo "Backup erstellt: backup-$DATUM.tar.gz"
}

backup /var/www/html

Script ausführbar machen und starten:

chmod +x mein-script.sh
./mein-script.sh

.bashrc und .zshrc konfigurieren

Die Datei ~/.bashrc (oder ~/.zshrc für Zsh-Nutzer) wird bei jedem Start einer interaktiven Shell ausgeführt. Hier kannst du Aliase, Funktionen und Umgebungsvariablen dauerhaft hinterlegen:

# Aliase – Abkürzungen für häufige Befehle
alias ll="ls -lah"
alias gs="git status"
alias update="sudo apt update && sudo apt upgrade -y"
alias ..="cd .."
alias ...="cd ../.."

# Umgebungsvariablen
export EDITOR="nano"
export PATH="$HOME/.local/bin:$PATH"

# Nützliche Funktion
mkcd() {
    mkdir -p "$1" && cd "$1"
}

# Änderungen sofort anwenden:
source ~/.bashrc

Wer täglich mit dem Terminal arbeitet, für den lohnt sich auch ein Blick auf Oh My Zsh (Plugin-Framework für Zsh) und Starship (konfigurierbares Prompt) – beide machen die Arbeit im Terminal deutlich angenehmer und übersichtlicher. Für die lokale Entwicklungsumgebung und das Arbeiten mit Containern empfiehlt sich ergänzend der Docker Desktop Guide.

Häufige Fragen

Ich habe aus Versehen eine Datei mit rm gelöscht – kann ich sie wiederherstellen?
Im Normalfall nein. Linux hat keinen Papierkorb für rm. Du kannst versuchen, mit Tools wie extundelete oder testdisk gelöschte Dateien von ext4-Partitionen wiederherzustellen, aber das ist kein verlässliches Verfahren. Tipp: Nutze trash-cli als rm-Ersatz, der Dateien zunächst in den Papierkorb verschiebt.

Was ist der Unterschied zwischen sudo und su?
sudo befehl führt einen einzelnen Befehl mit Root-Rechten aus. su - wechselt vollständig in den Root-Benutzer (ganzer Shell-Kontext). Für moderne Systeme ist sudo zu bevorzugen – es ist sicherer, weil du nur einzelne Befehle erhöhst und alles in /var/log/auth.log protokolliert wird.

Wie finde ich heraus, was ein Befehl macht?
Mit man befehlsname öffnest du die Manpage (Handbuchseite). Alternativ hilft befehlsname --help für eine Kurzübersicht. Das Tool tldr (installierbar via npm install -g tldr) zeigt noch kompaktere Beispiele für den schnellen Einstieg.

Kann ich das Terminal unter Windows nutzen?
Ja! Mit dem Windows Subsystem for Linux (WSL2) läuft eine echte Linux-Umgebung direkt unter Windows. Du bekommst eine vollständige Bash-Shell, kannst Linux-Tools nutzen und sogar auf das Windows-Dateisystem zugreifen. Für Entwickler ist WSL2 ein Game-Changer.

Was ist der Unterschied zwischen bash und zsh?
Beide sind Unix-Shells mit ähnlichem Grundbefehlssatz. Zsh (Z Shell) bietet bessere Tab-Vervollständigung, verbessertes Globbing, Plugin-Unterstützung (Oh My Zsh) und ist seit macOS Catalina die Standard-Shell auf dem Mac. Bash ist universeller verbreitet und auf praktisch jedem Linux-System vorinstalliert. Für Scripting gilt: Bash-Scripts laufen überall, Zsh-spezifische Features sind weniger portabel.