Die Shell ist das Herzstück von Linux. Was auf den ersten Blick einschüchternd wirkt, wird schnell zum mächtigsten Werkzeug in deinem Arsenal. Dieser Guide bringt dich von Null auf produktiv.
Die Shell: Dein direkter Draht zum System
Was ist die Shell?
Die Shell ist ein Programm, das zwischen dir und dem Betriebssystem vermittelt. Du gibst Befehle ein, die Shell führt sie aus und zeigt dir das Ergebnis.
%%{init: {'theme': 'dark'}}%%
flowchart LR
A[Du] -->|Befehl| B[Shell]
B -->|Ausführung| C[Linux Kernel]
C -->|Ergebnis| B
B -->|Ausgabe| A
style B fill:#7c3aed,stroke:#a78bfa,color:#fff
Shell vs. Terminal
| Begriff |
Bedeutung |
| Terminal |
Das Fenster/Programm, in dem du tippst (z.B. GNOME Terminal, Konsole) |
| Shell |
Der Interpreter, der deine Befehle verarbeitet (z.B. Bash, Zsh) |
| Prompt |
Die Eingabeaufforderung, die auf deine Befehle wartet |
Beliebte Shells
| Shell |
Beschreibung |
| Bash |
Standard auf den meisten Linux-Systemen |
| Zsh |
Moderner, mit besserer Autovervollständigung |
| Fish |
Benutzerfreundlich, mit Syntax-Highlighting |
Dieses Tutorial verwendet Bash-Syntax, die auch in Zsh funktioniert.
Der Prompt verstehen
Wenn du ein Terminal öffnest, siehst du den Prompt:
Die Bestandteile des Prompts
| Teil |
Bedeutung |
darthvaper |
Dein Benutzername |
@ |
Trennzeichen |
homelab |
Hostname des Computers |
: |
Trennzeichen |
~ |
Aktuelles Verzeichnis (~ = Home-Verzeichnis) |
$ |
Normaler Benutzer (# = Root) |
Erste Schritte: Navigation
Wo bin ich? - pwd
1
2
| pwd
# /home/darthvaper
|
pwd = Print Working Directory
Was ist hier? - ls
1
2
3
4
| ls # Dateien auflisten
ls -l # Detaillierte Liste
ls -la # Inklusive versteckter Dateien
ls -lh # Mit lesbaren Dateigrößen
|
Beispielausgabe von ls -la:
1
2
3
4
5
| drwxr-xr-x 5 darthvaper darthvaper 4096 Jan 5 10:00 .
drwxr-xr-x 3 root root 4096 Jan 1 12:00 ..
-rw-r--r-- 1 darthvaper darthvaper 220 Jan 1 12:00 .bashrc
drwxr-xr-x 2 darthvaper darthvaper 4096 Jan 5 09:00 Dokumente
-rw-r--r-- 1 darthvaper darthvaper 1024 Jan 5 10:00 notizen.txt
|
Verzeichnis wechseln - cd
1
2
3
4
5
6
| cd /etc # Absoluter Pfad
cd Dokumente # Relativer Pfad
cd .. # Ein Verzeichnis nach oben
cd ~ # Ins Home-Verzeichnis
cd - # Zum vorherigen Verzeichnis
cd # Auch ins Home-Verzeichnis
|
Verzeichnisstruktur verstehen
%%{init: {'theme': 'dark'}}%%
flowchart TD
A["/"] --> B["/home"]
A --> C["/etc"]
A --> D["/var"]
A --> E["/usr"]
B --> F["/home/darthvaper"]
F --> G["~/Dokumente"]
F --> H["~/Downloads"]
style A fill:#f7768e,stroke:#f7768e
style F fill:#7c3aed,stroke:#a78bfa
| Verzeichnis |
Inhalt |
/ |
Wurzelverzeichnis (Root) |
/home |
Benutzerverzeichnisse |
/etc |
Konfigurationsdateien |
/var |
Variable Daten (Logs, Datenbanken) |
/usr |
Programme und Bibliotheken |
/tmp |
Temporäre Dateien |
/root |
Home-Verzeichnis des Root-Users |
Dateien und Verzeichnisse verwalten
Erstellen
1
2
3
4
5
6
7
8
9
| # Verzeichnis erstellen
mkdir projekte
mkdir -p projekte/web/css # Mit Unterverzeichnissen
# Leere Datei erstellen
touch notizen.txt
# Datei mit Inhalt erstellen
echo "Hallo Welt" > hallo.txt
|
Kopieren - cp
1
2
3
| cp datei.txt kopie.txt # Datei kopieren
cp datei.txt /tmp/ # In anderes Verzeichnis
cp -r ordner/ backup/ # Verzeichnis rekursiv kopieren
|
Verschieben/Umbenennen - mv
1
2
3
| mv alt.txt neu.txt # Umbenennen
mv datei.txt /tmp/ # Verschieben
mv datei.txt /tmp/neuer_name.txt # Verschieben und umbenennen
|
Löschen - rm
1
2
3
4
| rm datei.txt # Datei löschen
rm -r ordner/ # Verzeichnis rekursiv löschen
rm -rf ordner/ # Ohne Nachfrage (VORSICHT!)
rmdir leerer_ordner/ # Nur leere Verzeichnisse
|
Warnung: rm -rf löscht unwiderruflich! Es gibt keinen Papierkorb.
Dateien anzeigen und bearbeiten
Inhalt anzeigen
1
2
3
4
5
6
| cat datei.txt # Gesamte Datei ausgeben
less datei.txt # Seitenweise anzeigen (q zum Beenden)
head datei.txt # Erste 10 Zeilen
head -n 20 datei.txt # Erste 20 Zeilen
tail datei.txt # Letzte 10 Zeilen
tail -f /var/log/syslog # Live-Ausgabe (Follow)
|
Texteditoren
| Editor |
Schwierigkeit |
Beschreibung |
nano |
Einfach |
Ideal für Anfänger |
vim |
Schwer |
Mächtig, steile Lernkurve |
nvim |
Schwer |
Moderner Vim |
Nano verwenden:
- Ctrl + O → Speichern
- Ctrl + X → Beenden
- Ctrl + K → Zeile ausschneiden
- Ctrl + U → Einfügen
- Ctrl + W → Suchen
Berechtigungen verstehen
Die Berechtigungsanzeige
1
2
| ls -l datei.txt
# -rw-r--r-- 1 darthvaper users 1024 Jan 5 10:00 datei.txt
|
Aufbau der Berechtigungsanzeige
1
2
3
4
5
6
| -rw-r--r--
│├──┤├──┤├──┤
│ │ │ └── Andere (Others): r-- (nur lesen)
│ │ └────── Gruppe (Group): r-- (nur lesen)
│ └────────── Besitzer (User): rw- (lesen, schreiben)
└───────────── Dateityp: - (Datei), d (Verzeichnis), l (Link)
|
Berechtigungen im Detail
| Symbol |
Bedeutung |
Für Dateien |
Für Verzeichnisse |
r |
Read |
Lesen |
Inhalt auflisten |
w |
Write |
Schreiben |
Erstellen/Löschen |
x |
Execute |
Ausführen |
Betreten |
- |
Keine |
- |
- |
Numerische Notation
| Berechtigung |
Binär |
Dezimal |
--- |
000 |
0 |
--x |
001 |
1 |
-w- |
010 |
2 |
-wx |
011 |
3 |
r-- |
100 |
4 |
r-x |
101 |
5 |
rw- |
110 |
6 |
rwx |
111 |
7 |
Beispiele:
| Numerisch |
Symbolisch |
Bedeutung |
755 |
rwxr-xr-x |
Besitzer: alles, Rest: lesen+ausführen |
644 |
rw-r--r-- |
Besitzer: lesen+schreiben, Rest: nur lesen |
700 |
rwx------ |
Nur Besitzer hat Zugriff |
777 |
rwxrwxrwx |
Alle dürfen alles (unsicher!) |
Berechtigungen ändern - chmod
1
2
3
4
5
6
7
8
9
10
| # Symbolisch
chmod u+x script.sh # Ausführbar für Besitzer
chmod g+w datei.txt # Schreibbar für Gruppe
chmod o-r datei.txt # Lesen entziehen für Andere
chmod a+r datei.txt # Lesen für alle
# Numerisch
chmod 755 script.sh # rwxr-xr-x
chmod 644 datei.txt # rw-r--r--
chmod 600 geheim.txt # rw-------
|
Besitzer ändern - chown
1
2
3
| chown benutzer datei.txt # Besitzer ändern
chown benutzer:gruppe datei.txt # Besitzer und Gruppe
chown -R benutzer ordner/ # Rekursiv
|
Benutzer und Sudo
Benutzerkonzept
%%{init: {'theme': 'dark'}}%%
flowchart TD
A[Root - UID 0] --> B[Volle Kontrolle]
C[Normale Benutzer] --> D[Eingeschränkte Rechte]
C --> E[Eigenes Home-Verzeichnis]
C --> F[Können sudo nutzen]
style A fill:#f7768e,stroke:#f7768e
style C fill:#7c3aed,stroke:#a78bfa
| Benutzertyp |
UID |
Beschreibung |
| root |
0 |
Superuser, kann alles |
| System |
1-999 |
Dienste (www-data, mysql, etc.) |
| Normal |
1000+ |
Echte Benutzer |
Wer bin ich?
1
2
3
| whoami # Aktueller Benutzername
id # UID, GID und Gruppen
groups # Gruppenmitgliedschaften
|
Sudo - Administratorrechte
sudo = Super User Do
1
2
3
| sudo apt update # Befehl als Root ausführen
sudo -i # Root-Shell öffnen
sudo -u www-data command # Als anderer Benutzer
|
Wichtige sudo-Regeln:
- Nur nutzen, wenn nötig
- Niemals
sudo rm -rf / ausführen!
- Befehle verstehen, bevor man sie mit sudo ausführt
Das Passwort wird für 15 Minuten gecacht. Danach erneute Eingabe nötig.
Sudoers-Datei
1
2
| # Sudoers bearbeiten (sicher)
sudo visudo
|
Typischer Eintrag:
1
| darthvaper ALL=(ALL:ALL) NOPASSWD: ALL
|
| Teil |
Bedeutung |
darthvaper |
Benutzername |
ALL= |
Von allen Hosts |
(ALL:ALL) |
Als alle Benutzer/Gruppen |
NOPASSWD: |
Ohne Passwortabfrage |
ALL |
Alle Befehle |
Pipes und Umleitungen
Ausgabeumleitung
1
2
3
4
5
6
7
8
9
10
11
12
13
| # In Datei schreiben (überschreiben)
echo "Hallo" > datei.txt
# An Datei anhängen
echo "Welt" >> datei.txt
# Fehlerausgabe umleiten
command 2> fehler.txt
# Beides umleiten
command > ausgabe.txt 2>&1
# Oder moderner:
command &> alles.txt
|
Übersicht der Umleitungen
Eingabeumleitung
1
2
3
4
5
6
7
8
| # Aus Datei lesen
sort < unsortiert.txt
# Here-Document
cat << EOF
Zeile 1
Zeile 2
EOF
|
Pipes - Befehle verketten
Die Pipe | leitet die Ausgabe eines Befehls als Eingabe an den nächsten:
1
2
3
4
5
6
7
8
9
10
11
| # Prozesse filtern
ps aux | grep firefox
# Zeilen zählen
cat datei.txt | wc -l
# Sortieren und Duplikate entfernen
cat namen.txt | sort | uniq
# Erste 5 größte Dateien
ls -lS | head -n 5
|
%%{init: {'theme': 'dark'}}%%
flowchart LR
A[Befehl 1] -->|stdout| B["|"]
B -->|stdin| C[Befehl 2]
C -->|stdout| D["|"]
D -->|stdin| E[Befehl 3]
style B fill:#7c3aed,stroke:#a78bfa,color:#fff
style D fill:#7c3aed,stroke:#a78bfa,color:#fff
Praktische Beispiele
1
2
3
4
5
6
7
8
9
10
11
| # Log-Datei durchsuchen und Zeilen zählen
cat /var/log/syslog | grep "error" | wc -l
# Festplattennutzung sortiert anzeigen
du -sh /* 2>/dev/null | sort -h
# Laufende Prozesse nach RAM sortiert
ps aux --sort=-%mem | head -10
# IP-Adressen aus Log extrahieren
grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' access.log | sort | uniq -c | sort -rn
|
Wichtige Tastenkombinationen
Navigation & Bearbeitung
| Tastenkombination |
Funktion |
| Ctrl + A |
Zum Zeilenanfang |
| Ctrl + E |
Zum Zeilenende |
| Ctrl + U |
Zeile vor Cursor löschen |
| Ctrl + K |
Zeile nach Cursor löschen |
| Ctrl + W |
Wort vor Cursor löschen |
| Ctrl + Y |
Gelöschtes einfügen |
| Alt + B |
Wort zurück |
| Alt + F |
Wort vorwärts |
Prozesssteuerung
| Tastenkombination |
Funktion |
| Ctrl + C |
Befehl abbrechen |
| Ctrl + Z |
Befehl pausieren (in Hintergrund) |
| Ctrl + D |
EOF senden / Shell beenden |
| Ctrl + L |
Bildschirm leeren (wie clear) |
History
| Tastenkombination |
Funktion |
| ↑ / ↓ |
Durch History navigieren |
| Ctrl + R |
History durchsuchen |
!! |
Letzten Befehl wiederholen |
!$ |
Letztes Argument des vorherigen Befehls |
!abc |
Letzten Befehl mit “abc” ausführen |
1
2
3
4
5
6
7
| # History anzeigen
history
# Befehl aus History ausführen
!42 # Befehl Nr. 42
!! # Letzter Befehl
sudo !! # Letzten Befehl mit sudo
|
Copy & Paste im Terminal
Linux Terminal (X11)
| Aktion |
Tastenkombination |
| Kopieren |
Ctrl + Shift + C |
| Einfügen |
Ctrl + Shift + V |
| Mit Maus |
Markieren = Kopieren, Mittelklick = Einfügen |
SSH/PuTTY (Windows)
| Aktion |
Methode |
| Kopieren |
Text markieren (automatisch kopiert) |
| Einfügen |
Rechtsklick |
tmux
| Aktion |
Tastenkombination |
| Copy-Mode |
Prefix, [ |
| Markieren |
Space (Start), Enter (Ende) |
| Einfügen |
Prefix, ] |
Suchen und Finden
Dateien finden - find
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # Nach Namen suchen
find /home -name "*.txt"
# Nach Typ
find /var -type f # Dateien
find /var -type d # Verzeichnisse
# Nach Größe
find /home -size +100M # Größer als 100MB
# Nach Änderungszeit
find /tmp -mtime -1 # Geändert in letzten 24h
# Mit Aktion
find /tmp -name "*.tmp" -delete
|
In Dateien suchen - grep
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| # Einfache Suche
grep "error" /var/log/syslog
# Rekursiv in Verzeichnis
grep -r "TODO" /home/projekt/
# Groß-/Kleinschreibung ignorieren
grep -i "fehler" logdatei.txt
# Mit Zeilennummern
grep -n "pattern" datei.txt
# Nur Dateinamen
grep -l "pattern" *.txt
# Invertiert (Zeilen OHNE Pattern)
grep -v "debug" log.txt
|
Kombiniert
1
2
3
4
5
| # Finden und durchsuchen
find /var/log -name "*.log" -exec grep -l "error" {} \;
# Mit xargs (effizienter)
find /var/log -name "*.log" | xargs grep -l "error"
|
Prozesse verwalten
Prozesse anzeigen
1
2
3
4
5
6
| ps # Eigene Prozesse
ps aux # Alle Prozesse
ps aux | grep nginx # Filtern
top # Interaktive Prozessansicht
htop # Bessere Version (falls installiert)
|
Prozesse beenden
1
2
3
4
| kill PID # Freundlich beenden (SIGTERM)
kill -9 PID # Erzwungen beenden (SIGKILL)
killall firefox # Nach Namen beenden
pkill -f "python" # Nach Muster beenden
|
Hintergrundprozesse
1
2
3
4
5
6
7
8
9
10
| # Im Hintergrund starten
command &
# Pausieren und in Hintergrund
# Ctrl+Z, dann:
bg # Im Hintergrund fortsetzen
fg # In Vordergrund holen
# Jobs anzeigen
jobs
|
Verbindungen zu anderen Systemen
SSH - Secure Shell
SSH-Keys einrichten
Dateien übertragen - scp
1
2
3
4
5
6
7
8
| # Lokal → Remote
scp datei.txt benutzer@server:/pfad/
# Remote → Lokal
scp benutzer@server:/pfad/datei.txt ./
# Verzeichnis kopieren
scp -r ordner/ benutzer@server:/pfad/
|
Dateien synchronisieren - rsync
1
2
3
4
5
6
7
8
| # Lokal → Remote (nur Änderungen)
rsync -avz ordner/ benutzer@server:/pfad/
# Mit Fortschritt
rsync -avz --progress quelle/ ziel/
# Löschen was im Ziel nicht mehr existiert
rsync -avz --delete quelle/ ziel/
|
Nützliche Befehle
1
2
3
4
5
6
| uname -a # Kernel-Info
hostname # Hostname
uptime # Laufzeit
free -h # Arbeitsspeicher
df -h # Festplattennutzung
lscpu # CPU-Info
|
Netzwerk
1
2
3
4
5
| ip addr # IP-Adressen
ip route # Routing-Tabelle
ping google.de # Erreichbarkeit testen
curl ifconfig.me # Externe IP
ss -tulpn # Offene Ports
|
Paketverwaltung (Debian/Ubuntu)
1
2
3
4
5
| sudo apt update # Paketlisten aktualisieren
sudo apt upgrade # Pakete aktualisieren
sudo apt install paket # Paket installieren
sudo apt remove paket # Paket entfernen
apt search stichwort # Pakete suchen
|
Archivierung
1
2
3
4
5
6
7
8
9
10
11
| # tar.gz erstellen
tar -czvf archiv.tar.gz ordner/
# tar.gz entpacken
tar -xzvf archiv.tar.gz
# zip erstellen
zip -r archiv.zip ordner/
# zip entpacken
unzip archiv.zip
|
Befehlsverkettung
Operatoren
| Operator |
Bedeutung |
Beispiel |
; |
Nacheinander (immer) |
cmd1 ; cmd2 |
&& |
Nur wenn erfolgreich |
cmd1 && cmd2 |
\|\| |
Nur wenn fehlgeschlagen |
cmd1 \|\| cmd2 |
1
2
3
4
5
6
7
8
9
10
11
| # Immer beide ausführen
echo "Start" ; echo "Ende"
# Nur bei Erfolg
apt update && apt upgrade
# Bei Fehler Alternative
ping -c1 server || echo "Nicht erreichbar"
# Kombiniert
mkdir projekt && cd projekt || echo "Fehler"
|
Aliase und Anpassungen
Aliase erstellen
1
2
3
4
5
6
7
| # Temporär (nur aktuelle Sitzung)
alias ll='ls -la'
alias update='sudo apt update && sudo apt upgrade'
# Permanent (in ~/.bashrc oder ~/.zshrc)
echo "alias ll='ls -la'" >> ~/.bashrc
source ~/.bashrc
|
Nützliche Aliase
1
2
3
4
5
6
7
8
9
10
11
12
13
| # Navigation
alias ..='cd ..'
alias ...='cd ../..'
# Sicherheit
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Produktivität
alias c='clear'
alias h='history'
alias ports='ss -tulpn'
|
Hilfe finden
Man-Pages
1
2
| man ls # Handbuch für ls
man -k keyword # Nach Befehl suchen
|
Navigation in man:
- Space → Seite weiter
- B → Seite zurück
- / → Suchen
- Q → Beenden
Weitere Hilfe
1
2
3
4
5
| command --help # Kurzhilfe
info command # Ausführliche Doku
whatis command # Einzeiler-Beschreibung
type command # Was ist der Befehl?
which command # Wo liegt der Befehl?
|
Cheat Sheet
Navigation
| Befehl |
Funktion |
pwd |
Aktuelles Verzeichnis |
ls -la |
Dateien auflisten |
cd pfad |
Verzeichnis wechseln |
cd .. |
Eine Ebene hoch |
cd ~ |
Home-Verzeichnis |
Dateien
| Befehl |
Funktion |
touch datei |
Datei erstellen |
mkdir ordner |
Verzeichnis erstellen |
cp quelle ziel |
Kopieren |
mv quelle ziel |
Verschieben |
rm datei |
Löschen |
Anzeigen
| Befehl |
Funktion |
cat datei |
Inhalt ausgeben |
less datei |
Seitenweise |
head -n 10 |
Erste 10 Zeilen |
tail -f |
Live-Ausgabe |
grep muster |
Suchen |
Berechtigungen
| Befehl |
Funktion |
chmod 755 datei |
Rechte setzen |
chown user:group |
Besitzer ändern |
sudo befehl |
Als Root |
Prozesse
| Befehl |
Funktion |
ps aux |
Prozesse anzeigen |
top / htop |
Interaktiv |
kill PID |
Beenden |
| Ctrl+C |
Abbrechen |
Fazit
Die Shell mag anfangs fremd wirken, aber mit etwas Übung wird sie zum unverzichtbaren Werkzeug:
| Vorteil |
Beschreibung |
| Geschwindigkeit |
Schneller als jede GUI |
| Automatisierung |
Befehle lassen sich scripten |
| Remote-Zugriff |
Funktioniert über SSH |
| Ressourcenschonend |
Keine grafische Oberfläche nötig |
| Mächtigkeit |
Kombination von Befehlen |
Mein Tipp: Übe täglich! Nutze die Shell für alltägliche Aufgaben, auch wenn es anfangs länger dauert. Nach ein paar Wochen wirst du die Maus kaum noch vermissen.
Weiterführende Ressourcen