Linux-Befehle-Spickzettel — über 200 Befehle nach Aufgabe

Linux-Befehle nach Aufgabe, von Dateien und Rechten bis zu Netzwerk, systemd und Textverarbeitung. Jeder Eintrag mit Optionen, kopierbaren Beispielen und macOS-Hinweisen.

Linux-Befehle-Spickzettel · freetoolsforweb.com/tools/linux-commands-cheat-sheet · geprüft am 2026-10-18

Zuletzt geprüft: 2026-10-18, abgeglichen mit den Handbüchern zu GNU coreutils 9.x, util-linux, procps-ng, iproute2, systemd und bash 5.2; macOS-Hinweise anhand der Manpages von macOS 26.

215 Einträge in 15 Abschnitten

Text anzeigen & bearbeiten

Dateien lesen, durch Logs blättern, im Terminal bearbeiten und Versionen vergleichen.

cat

Dateien ausgeben oder zusammenfügen

Linux · macOS#
cat [-n] [-A] file...
-n
alle Zeilen nummerieren
-A
Tabs als ^I und Zeilenenden als $ anzeigen (GNU); macht CRLF-Zeilenenden sichtbar
cat /etc/os-release

eine Datei ausgeben

cat part1.txt part2.txt > whole.txt

zusammenfügen

cat -A script.sh | head

versteckte Tabs und Windows-Zeilenenden ^M aufspüren

macOS/BSD: cat unter macOS hat kein -A; cat -vet liefert dieselbe Ansicht.

tac

Datei mit der letzten Zeile zuerst ausgeben

Linux#
tac file
tac access.log | head

neueste Logzeilen zuerst

macOS/BSD: Gibt es unter macOS nicht; nimm tail -r file.

less

Durch eine lange Datei oder Ausgabe blättern

Linux · macOS#
less [-N] [-S] [+F] file
Space / b
Seite vor / zurück
/text
vorwärts suchen; n nächster, N vorheriger Treffer
g / G
zum Anfang / Ende springen
F
der Datei folgen wie tail -f; Ctrl+C zum Stoppen
q
beenden
-N
Zeilennummern anzeigen
-S
lange Zeilen nicht umbrechen (seitwärts scrollen)
less /var/log/syslog

ein Log lesen

journalctl -u nginx | less -S

breite Zeilen ohne Umbruch

head

Erste Zeilen einer Datei anzeigen

Linux · macOS#
head [-n N] [-c N] file...
-n N
erste N Zeilen (Standard 10)
-c N
erste N Bytes
-n -N
alles außer den letzten N Zeilen (GNU)
head -n 20 data.csv

Kopfzeile und erste Zeilen

head -c 512 file.bin | xxd

einen Blick auf den Anfang einer Binärdatei werfen

macOS/BSD: head unter macOS akzeptiert keine negativen Werte.

tail

Ende einer Datei anzeigen oder live verfolgen

Linux · macOS#
tail [-n N] [-f|-F] file...
-n N
letzte N Zeilen (Standard 10)
-n +N
ab Zeile N beginnen
-f
weiter ausgeben, während die Datei wächst
-F
nach Namen folgen, übersteht Logrotation
tail -n 50 app.log

letzte 50 Zeilen

tail -F /var/log/nginx/access.log

ein rotiertes Log beobachten

tail -n +2 data.csv

die Kopfzeile einer CSV überspringen

nano

Datei mit einem einfachen Editor bearbeiten

Linux#
nano file
Ctrl+O
speichern
Ctrl+X
beenden
Ctrl+W
suchen
Ctrl+K / Ctrl+U
Zeile ausschneiden / einfügen
Alt+U
rückgängig
sudo nano /etc/hosts

eine Systemdatei bearbeiten

Die Kürzelleiste unten am Bildschirm zeigt die Tasten; ^ steht für Ctrl und M- für Alt.

vim

Datei mit vim bearbeiten (und wie man es beendet)

Linux · macOS#
vim file
i
Einfügemodus (Text tippen)
Esc
zurück in den Normalmodus
:w / :q / :wq
speichern / beenden / speichern und beenden
:q!
beenden ohne zu speichern
/text
suchen; n für den nächsten Treffer
dd / yy / p
Zeile löschen / Zeile kopieren / einfügen
u / Ctrl+R
rückgängig / wiederholen
vim +42 app.py

in Zeile 42 öffnen

diff

Zwei Dateien oder Verzeichnisse vergleichen

Linux · macOS#
diff [-u] [-r] [-q] [-w] a b
-u
Unified-Format (das nutzen patch und git)
-r
Verzeichnisse rekursiv vergleichen
-q
nur melden, ob sich Dateien unterscheiden
-w
alle Leerzeichen ignorieren
-y
nebeneinander
diff -u old.conf new.conf

gut lesbare Änderungsansicht

diff -rq dir1/ dir2/

welche Dateien sich zwischen zwei Bäumen unterscheiden

diff <(sort a.txt) <(sort b.txt)

nach dem Sortieren vergleichen, per Prozesssubstitution

tee

Ausgabe gleichzeitig in eine Datei und auf den Bildschirm schreiben

Linux · macOS#
tee [-a] file...
-a
anhängen statt überschreiben
make 2>&1 | tee build.log

einen Build beobachten und ein Log behalten

echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

an eine Datei von root anhängen (sudo echo >> scheitert, weil die Shell die Umleitung ausführt)

printf

Formatierten Text zuverlässig ausgeben

Linux · macOS#
printf 'format' args...
printf '%s\n' "$var"

eine Variable sicher ausgeben, selbst wenn sie mit -n beginnt

printf '%-12s %6.2f\n' disk 93.5

ausgerichtete Spalten

echo -e und echo -n verhalten sich je nach Shell unterschiedlich; printf verhält sich überall gleich.

column

Ausgabe als Tabelle ausrichten

Linux · macOS#
column -t [-s separators]
column -t -s, data.csv | less -S

eine einfache CSV als Tabelle lesen

mount | column -t

durch Leerzeichen getrennte Ausgabe ausrichten

xxd / hexdump

Datei als Hex anzeigen

Linux · macOS#
xxd file | hexdump -C file
xxd image.png | head

Hex und ASCII nebeneinander

hexdump -C file.bin | head

kanonischer Hexdump

xxd gehört zu den vim-Paketen; hexdump ist in util-linux (bei neueren Debian/Ubuntu in bsdextrautils).

strings

Lesbaren Text aus einer Binärdatei ziehen

Linux · macOS#
strings [-n min] file
-n N
nur Zeichenketten mit mindestens N Zeichen (Standard 4)
strings -n 8 firmware.bin | less

Versionsangaben, URLs, Pfade finden

Unter Linux Teil von binutils.

Berechtigungen & Besitz

Lesen und ändern, wer eine Datei lesen, schreiben und ausführen darf.

ls -l

Eine Berechtigungsangabe wie -rwxr-x--- lesen

Linux · macOS#
ls -l file
ls -l deploy.sh

-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh

Das erste Zeichen ist der Typ (- Datei, d Verzeichnis, l Symlink). Dann drei Dreiergruppen: Besitzer, Gruppe, alle anderen. r=4, w=2, x=1, also ist rwxr-x--- gleich 750.

chmod

Berechtigungen mit Oktalzahlen ändern

Linux · macOS#
chmod [-R] mode file...
-R
auf ein Verzeichnis und alles darin anwenden
-v
jede Änderung melden
chmod 644 index.html

Besitzer lesen/schreiben, alle lesen: normale Dateien

chmod 755 deploy.sh

Besitzer alles, andere lesen/ausführen: Skripte und Verzeichnisse

chmod 600 ~/.ssh/id_ed25519

privater Schlüssel nur für dich lesbar; ssh lehnt lockerer geschützte Schlüssel ab

chmod u+x

Berechtigungen mit Buchstaben ändern (u/g/o +/-)

Linux · macOS#
chmod [ugoa][+-=][rwxX] file...
chmod +x script.sh

ein Skript ausführbar machen

chmod go-w file

Schreibrecht für Gruppe und andere entfernen

chmod -R u=rwX,go=rX site/

großes X setzt das Ausführrecht nur bei Verzeichnissen und Dateien, die es schon hatten

chmod -R 777

Warum chmod -R 777 die falsche Lösung ist

GefährlichLinux · macOS#
chmod -R 777 dir
find site/ -type d -exec chmod 755 {} +

die richtige Lösung, Teil 1: Verzeichnisse 755

find site/ -type f -exec chmod 644 {} +

Teil 2: Dateien 644

Achtung: Gibt jedem Benutzer und jedem kompromittierten Dienst auf dem Rechner Schreibzugriff auf den ganzen Baum, macht alle Dateien ausführbar und lässt OpenSSH Schlüssel in einem ~/.ssh mit 777 ablehnen. Auf /etc oder /usr angewendet, kann es sudo und das System lahmlegen. Korrigier stattdessen den Besitz mit chown oder nutze die beiden find-Befehle.

chown

Besitzer und Gruppe von Dateien ändern

GefährlichLinux · macOS#
chown [-R] user[:group] file...
-R
rekursiv
user:
mit abschließendem Doppelpunkt ohne Gruppe wird die Gruppe auf die Login-Gruppe des Benutzers gesetzt
sudo chown -R www-data:www-data /var/www/site

ein Web-Root dem Webserver-Benutzer übergeben

sudo chown "$USER": file.txt

eine von root angelegte Datei übernehmen

Achtung: sudo chown -R auf /, /usr oder /etc löscht setuid-Bits und Besitzverhältnisse, auf die sudo, passwd und Dienste angewiesen sind; meist hilft dann nur eine Neuinstallation. Prüf den Pfad doppelt.

chgrp

Nur die Gruppe von Dateien ändern

Linux · macOS#
chgrp [-R] group file...
chgrp -R developers /srv/shared

einen gemeinsamen Ordner einer Teamgruppe übergeben

umask

Standardberechtigungen für neue Dateien festlegen

Linux · macOS#
umask [mask]
umask

aktuelle Maske anzeigen, meist 0022

umask 077

neue Dateien 600 und Verzeichnisse 700 in dieser Shell

Die Maske entfernt Bits: Dateien starten bei 666 und Verzeichnisse bei 777, 022 ergibt also 644 und 755.

sudo

Befehl als root (oder anderer Benutzer) ausführen

Linux · macOS#
sudo [-u user] [-i] command
-i
Login-Shell als root
-u user
als dieser Benutzer statt als root ausführen
-l
auflisten, was du ausführen darfst
-k
zwischengespeicherte Anmeldedaten verwerfen
sudo systemctl restart nginx

ein einzelner Admin-Befehl

sudo !!

vorherigen Befehl mit sudo erneut ausführen

sudo -u postgres psql

als Dienstbenutzer ausführen

su

Zu einem anderen Benutzer wechseln

Linux · macOS#
su [-] [user]
su - deploy

als deploy mit dessen Umgebung anmelden

sudo su -

root-Shell, wenn root kein Passwort hat (sudo -i macht dasselbe)

setfacl / getfacl

Einem weiteren Benutzer per ACL Zugriff geben

Linux#
setfacl -m u:user:perms file
-m
einen Eintrag ändern (hinzufügen)
-x
einen Eintrag entfernen
-b
alle ACL-Einträge entfernen
-R
rekursiv
-d
Standard-ACL setzen, die neue Dateien erben
setfacl -m u:alice:rw report.xlsx

alice darf lesen und schreiben, ohne die Gruppe zu ändern

getfacl report.xlsx

alle Einträge anzeigen

setfacl -R -m g:devs:rwX /srv/app

eine Gruppe erhält Zugriff auf einen ganzen Baum

Ein + am Ende der Berechtigungsangabe von ls -l bedeutet, dass die Datei eine ACL hat.

chattr / lsattr

Datei unveränderlich machen

Linux#
chattr +i|-i file
sudo chattr +i /etc/resolv.conf

niemand, nicht einmal root, kann sie ändern oder löschen, bis -i gesetzt wird

lsattr /etc/resolv.conf

Attribute anzeigen; i bedeutet unveränderlich

Unterstützt auf ext4, XFS, Btrfs. Erscheint selbst als root „Operation not permitted“, prüf lsattr.

Prozesse & Jobs

Herausfinden, was läuft, es stoppen und Dinge im Hintergrund ausführen.

ps

Laufende Prozesse auflisten

Linux · macOS#
ps aux | ps -ef | ps -o fields -p PID
aux
alle Prozesse mit CPU, Speicher, Benutzer (BSD-Stil)
-ef
alle Prozesse mit Eltern-PID (System-V-Stil)
-o
Spalten auswählen
--sort=-%mem
nach Speicher sortieren, höchster zuerst (procps)
ps aux | grep [n]ginx

der [n]-Trick hält grep selbst aus den Ergebnissen heraus

ps aux --sort=-%mem | head

größte Speicherverbraucher

ps -o pid,ppid,etime,cmd -p 1234

wie lange ein Prozess schon läuft

macOS/BSD: ps unter macOS hat kein --sort; nimm ps aux -m (nach Speicher) oder ps aux -r (nach CPU).

pstree

Prozesse als Eltern-/Kind-Baum anzeigen

Linux#
pstree [-p] [user|PID]
pstree -p

mit PIDs

pstree -p 1234

was ein Prozess gestartet hat

top

CPU- und Speichernutzung live beobachten

Linux · macOS#
top [-u user] [-p PID] [-b -n 1]
P / M
nach CPU / Speicher sortieren (Linux-top)
1
jeden CPU-Kern anzeigen
k
Prozess per PID beenden
q
beenden
-b -n 1
ein einzelner Batch-Snapshot, für Skripte
top -b -n 1 | head -20

Snapshot, den du in ein Ticket einfügen kannst

macOS/BSD: top unter macOS ist ein anderes Programm: sortieren mit top -o cpu oder top -o mem.

htop

Freundlichere interaktive Prozessansicht

Linux#
htop [-u user]
F3 or /
suchen
F4
filtern
F6
Sortierspalte wählen
F9
ein Signal senden (kill)
t
Baumansicht
htop -u www-data

nur die Prozesse eines Benutzers

Installieren mit apt install htop / dnf install htop.

pgrep

Prozess-IDs nach Namen finden

Linux · macOS#
pgrep [-a] [-f] [-u user] pattern
-a
vollständige Befehlszeile anzeigen (Linux procps)
-f
gegen die vollständige Befehlszeile prüfen, nicht nur den Namen
-u user
nur Prozesse dieses Benutzers
-x
exakte Übereinstimmung des Namens
pgrep -a nginx

PIDs und Befehlszeilen

pgrep -f 'python manage.py runserver'

ein Skript anhand seiner Argumente finden

macOS/BSD: Unter macOS bedeutet -a „Vorfahren einschließen“; nimm pgrep -lf, um Namen und Argumente zu sehen.

pkill

Prozesse nach Namen stoppen

Linux · macOS#
pkill [-signal] [-f] [-u user] pattern
pkill -f "node server.js"

eine Node-App stoppen

pkill -HUP nginx

ein Reload-Signal senden

pgrep -af node

vor dem Beenden prüfen, was -f treffen würde

Muster sind reguläre Ausdrücke, die irgendwo im Namen passen; pkill node trifft auch nodejs-helper. Vorher mit pgrep prüfen.

kill

Signal an einen Prozess senden (stoppen, beenden, neu laden)

Linux · macOS#
kill [-signal] PID...
(none) / -15 / -TERM
den Prozess bitten, sich sauber zu beenden (Standard)
-9 / -KILL
Beenden erzwingen; nicht abfangbar, kein Aufräumen
-1 / -HUP
viele Daemons laden dann ihre Konfiguration neu
-l
Signalnamen auflisten
kill 1234

höflich stoppen

kill -9 1234

letzter Ausweg, wenn TERM ignoriert wird

kill %1

Job 1 dieser Shell beenden

Versuch zuerst ein einfaches kill und gib ihm ein paar Sekunden: -9 überspringt das Aufräumen, sodass temporäre Dateien, Locks und halb geschriebene Daten zurückbleiben können.

killall

Alle Prozesse mit exaktem Namen beenden

Linux · macOS#
killall [-signal] name
killall firefox

alle Firefox-Prozesse

Unter Linux steckt das im Paket psmisc.

Ctrl+Z, bg, fg, jobs

Befehl pausieren und im Hintergrund fortsetzen

Linux · macOS#
Ctrl+Z; bg [%n]; fg [%n]; jobs
jobs

Jobs dieser Shell mit ihren Nummern auflisten

bg %1

Job 1 im Hintergrund fortsetzen

fg %1

wieder in den Vordergrund holen

Ctrl+Z hält das Vordergrundprogramm an (es läuft erst nach bg oder fg weiter).

&

Befehl im Hintergrund starten

Linux · macOS#
command &
./long-export.sh > export.log 2>&1 &

starten und den Prompt zurückbekommen

wait

im Skript auf das Ende der Hintergrundjobs warten

nohup

Befehl nach dem Abmelden weiterlaufen lassen

Linux · macOS#
nohup command > log 2>&1 &
nohup ./server > server.log 2>&1 &

übersteht das Schließen der SSH-Sitzung

Für alles Langlebige ist ein systemd-Dienst (siehe Dienste & Logs) oder tmux robuster.

disown

Bereits laufenden Job von der Shell lösen

Linux · macOS#
disown [-h] [%n]
disown -h %1

nohup vergessen: mit bg in den Hintergrund schicken, dann disown

tmux

Terminalsitzung über Verbindungsabbrüche hinweg am Leben halten

Linux#
tmux new -s name | tmux attach -t name
Ctrl+B d
abkoppeln (Sitzung läuft weiter)
Ctrl+B c
neues Fenster
Ctrl+B % / Ctrl+B "
links/rechts / oben/unten teilen
tmux ls
Sitzungen auflisten
tmux new -s deploy

eine benannte Sitzung starten

tmux attach -t deploy

nach einem SSH-Abbruch wieder verbinden

Installation über deinen Paketmanager. GNU screen ist die ältere Alternative (Ctrl+A d zum Abkoppeln, screen -r zum Wiederverbinden).

nice / renice

Befehl mit niedrigerer (oder höherer) CPU-Priorität ausführen

Linux · macOS#
nice -n N command | renice -n N -p PID
nice -n 19 tar -czf backup.tgz /data

hintergrundschonendes Backup

sudo renice -n -5 -p 1234

Priorität eines laufenden Prozesses erhöhen

Der Nice-Wert reicht von -20 (höchste Priorität) bis 19 (niedrigste). Nur root darf unter 0 gehen.

timeout

Befehl beenden, wenn er zu lange läuft

Linux#
timeout [-s signal] duration command
timeout 30s curl -s https://example.com/health

nach 30 Sekunden aufgeben

timeout -s KILL 5m ./job.sh

nach fünf Minuten hart beenden

Endet mit Status 124, wenn das Zeitlimit erreicht wurde.

watch

Befehl alle paar Sekunden erneut ausführen

Linux#
watch [-n seconds] [-d] command
watch -n 2 df -h

zusehen, wie der Speicherplatz vollläuft

watch -d 'ss -s'

-d hebt Änderungen hervor

lsof

Sehen, welcher Prozess eine Datei oder einen Port offen hat

Linux · macOS#
lsof [-i :port] [-p PID] [file]
sudo lsof -i :8080

was auf Port 8080 lauscht

sudo lsof +L1

gelöschte, aber noch offene Dateien (Platte voll, aber du zeigt nichts)

lsof -p 1234

alle Dateien, die ein Prozess offen hat

fuser

Finden (oder beenden), was einen Mountpoint oder Port nutzt

GefährlichLinux#
fuser [-v] [-m] [-k] target
sudo fuser -vm /mnt/usb

warum umount „target is busy“ meldet

sudo fuser -v 8080/tcp

Prozess auf einem TCP-Port

Achtung: fuser -k beendet ohne Rückfrage jeden Prozess, der das Ziel nutzt; bei einem Mountpoint kann das auch deine eigene Shell sein.

time

Messen, wie lange ein Befehl dauert

Linux · macOS#
time command
time ./build.sh

real = Echtzeit, user + sys = CPU-Zeit

strace

Systemaufrufe eines Programms verfolgen

Linux#
strace [-f] [-e trace=...] command | strace -p PID
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT

welche Dateien öffnet es tatsächlich?

sudo strace -p 1234

woran hängt ein blockierter Prozess?

Systeminfo & Ressourcen

OS-Version, Kernel, CPU, Speicher, Hardware, Zeit und Last.

uname

Kernelversion und Architektur anzeigen

Linux · macOS#
uname [-a|-r|-m]
-a
alles
-r
Kernel-Release
-m
Rechnerarchitektur: x86_64, aarch64
uname -r

z. B. 6.8.0-45-generic

uname -m

welche Binärdatei du herunterladen musst: x86_64 oder aarch64

cat /etc/os-release

Linux-Distribution und Version herausfinden

Linux#
cat /etc/os-release
cat /etc/os-release

NAME, VERSION_ID, ID für jede Distribution aus der systemd-Ära

lsb_release -a

Alternative für Debian/Ubuntu, falls installiert

macOS/BSD: macOS: sw_vers.

hostnamectl

Hostnamen anzeigen oder setzen

Linux#
hostnamectl [set-hostname name]
hostnamectl

Hostname, OS, Kernel, Virtualisierung

sudo hostnamectl set-hostname web01

den Rechner umbenennen

uptime

Laufzeit und Durchschnittslast anzeigen

Linux · macOS#
uptime
uptime

Durchschnittslast über 1, 5 und 15 Minuten

Die Last ist die Zahl der laufenden oder wartenden Prozesse. Vergleich sie mit der CPU-Anzahl (nproc): Eine Last von 4 auf 4 Kernen bedeutet volle Auslastung.

free

Speicher- und Swap-Nutzung prüfen

Linux#
free [-h]
free -h

auf die Spalte „available“ schauen, nicht auf „free“

macOS/BSD: macOS: vm_stat oder top -l 1 | grep PhysMem.

Linux nutzt freien RAM als Festplatten-Cache, daher sieht „free“ auf einem gesunden Rechner niedrig aus. „available“ ist das, was Programme noch bekommen können.

lscpu / nproc

CPU-Modell und Anzahl der Kerne anzeigen

Linux#
lscpu | nproc
lscpu

Modell, Sockel, Kerne, Threads, Flags

make -j"$(nproc)"

alle verfügbaren Kerne nutzen

macOS/BSD: macOS: sysctl -n hw.ncpu und sysctl -n machdep.cpu.brand_string.

lspci / lsusb

PCI- und USB-Geräte auflisten

Linux#
lspci [-k] | lsusb
lspci -k | grep -A3 -i vga

Grafikkarte und verwendeter Treiber

lsusb

wird das USB-Gerät überhaupt erkannt?

dmidecode / lshw

RAM-Steckplätze, BIOS und Hardwaredetails anzeigen

Linux#
sudo dmidecode -t type | sudo lshw -short
sudo dmidecode -t memory | grep -i size

installierter RAM pro Steckplatz

sudo lshw -short

eine Zeile pro Gerät

dmesg

Kernelmeldungen lesen (Hardware, Treiber, OOM-Kills)

Linux#
dmesg [-T] [-w] [--level=...]
-T
lesbare Zeitstempel
-w
neuen Meldungen folgen
--level=err,warn
nur Probleme
sudo dmesg -T | tail -30

was gerade passiert ist (USB eingesteckt, Festplattenfehler)

sudo dmesg -T | grep -i 'out of memory'

hat der OOM-Killer deine App gestoppt?

/proc

Rohdaten zu CPU, Speicher und Prozessen aus /proc lesen

Linux#
cat /proc/<file>
grep MemAvailable /proc/meminfo

verfügbarer Speicher in kB

grep -c ^processor /proc/cpuinfo

Anzahl logischer CPUs

cat /proc/1234/status

Zustand und Speicher eines Prozesses

vmstat / iostat

Sehen, ob CPU, Speicher oder Festplatte der Engpass ist

Linux#
vmstat interval count | iostat -xz interval
vmstat 1 5

r = Run-Queue, si/so = Swapping, wa = Warten auf I/O

iostat -xz 1

Auslastung (%util) und Latenz (await) pro Festplatte

iostat stammt aus dem Paket sysstat.

date

Datum und Unix-Zeitstempel ausgeben oder berechnen

Linux · macOS#
date [+format] [-d 'description']
+%F
YYYY-MM-DD
+%s
Unix-Zeitstempel (Sekunden)
-d 'text'
ein Datum parsen: tomorrow, 2 days ago, @1700000000 (GNU)
-u
UTC
date '+%Y-%m-%d %H:%M:%S'

Zeitstempel für Logs

date +%s

Sekunden seit 1970-01-01 UTC

date -d @1700000000

Zeitstempel in Datum umwandeln (GNU)

date -d '2 days ago' +%F

relatives Datum (GNU)

macOS/BSD: date unter macOS hat kein -d. Nimm date -r 1700000000 für einen Zeitstempel, date -v-2d für „vor 2 Tagen“ und date -j -f '%Y-%m-%d' 2026-10-18 +%s zum Parsen.

timedatectl

Zeitzone einstellen und Uhrsynchronisation prüfen

Linux#
timedatectl [set-timezone Zone]
timedatectl

Ortszeit, UTC, Zeitzone, per NTP synchronisiert?

timedatectl list-timezones | grep America

den Zonennamen finden

sudo timedatectl set-timezone America/Toronto

Zeitzone ändern

Festplatten & Dateisysteme

Freier Speicher, was ihn belegt, Partitionen, Einhängen und Formatieren.

df

Freien Speicherplatz prüfen

Linux · macOS#
df [-h] [-T] [-i] [path]
-h
lesbare Größen
-T
Dateisystemtyp anzeigen (GNU)
-i
Inode-Nutzung statt Bytes
df -h

alle eingehängten Dateisysteme

df -h .

das Dateisystem, auf dem dieses Verzeichnis liegt

df -i

„No space left“ trotz freier Bytes? Dann sind vielleicht die Inodes aus

macOS/BSD: Unter macOS filtert -T nach Typ, statt ihn anzuzeigen.

du

Herausfinden, was Speicherplatz belegt

Linux · macOS#
du [-s] [-h] [-d depth] [path...]
-s
eine Summe pro Argument
-h
lesbare Größen
-d N
Tiefenlimit (GNU-Langform: --max-depth=N)
-x
auf einem Dateisystem bleiben
du -sh /var/log

Größe eines Ordners

du -h -d 1 | sort -h

Unterordner, größter zuletzt (funktioniert mit GNU und macOS)

sudo du -xh -d 1 / | sort -h | tail

die größten Verzeichnisse auf oberster Ebene

macOS/BSD: du unter macOS hat -d, aber kein --max-depth.

ncdu

Speichernutzung interaktiv durchsuchen

Linux#
ncdu [-x] [path]
sudo ncdu -x /

mit den Pfeiltasten navigieren, d zum Löschen

Installieren mit apt install ncdu / dnf install ncdu.

lsblk

Festplatten und Partitionen auflisten

Linux#
lsblk [-f]
-f
Dateisystemtyp, Label, UUID, Mountpoint
lsblk

Festplatten, Partitionen, Größen, Mountpoints

lsblk -f

welche Partition ext4/xfs ist, und ihre UUID

macOS/BSD: macOS: diskutil list.

blkid

UUID einer Partition ermitteln

Linux#
sudo blkid [device]
sudo blkid /dev/sdb1

UUID und TYPE, für /etc/fstab

findmnt

Anzeigen, was wo eingehängt ist

Linux#
findmnt [target] | findmnt -T path
findmnt

Mount-Baum mit Optionen

findmnt -T /var/lib/docker

welches Dateisystem diesen Pfad enthält

sudo findmnt --verify

/etc/fstab vor dem Neustart auf Fehler prüfen

mount

Festplatte oder Partition einhängen

Linux#
mount [-t type] [-o options] device dir
sudo mount /dev/sdb1 /mnt/usb

einen USB-Stick einhängen (das Verzeichnis muss existieren)

sudo mount -o remount,rw /

ein schreibgeschütztes Root beschreibbar machen

sudo mount -t nfs nas:/export /mnt/nas

eine NFS-Freigabe einhängen

umount

Festplatte aushängen

Linux#
umount dir|device
sudo umount /mnt/usb

danach kannst du sicher abstecken

sudo umount -l /mnt/nas

lazy: jetzt lösen, aufräumen, sobald nicht mehr belegt

„target is busy“ heißt, dass ein Prozess sie nutzt (oft deine eigene Shell, die in dem Verzeichnis steht): Finde ihn mit fuser -vm oder lsof.

/etc/fstab

Festplatte beim Booten automatisch einhängen

Linux#
UUID=<uuid> <mountpoint> <type> <options> <dump> <pass>
UUID=3f6c...  /data  ext4  defaults,nofail  0  2

eine Zeile pro Dateisystem; mit nofail bootet das System weiter, wenn die Platte fehlt

sudo mount -a

alles aus der fstab jetzt einhängen: vor dem Neustart testen

Ein Tippfehler in der fstab kann den nächsten Bootvorgang im Notfallmodus enden lassen. Führ nach dem Bearbeiten immer sudo mount -a (oder findmnt --verify) aus.

fdisk / parted

Partitionstabellen anzeigen oder bearbeiten

GefährlichLinux#
sudo fdisk -l | sudo fdisk /dev/sdX | sudo parted /dev/sdX print
sudo fdisk -l

alle Festplatten und ihre Partitionen

sudo parted /dev/sdb print

Typ der Partitionstabelle (gpt/msdos) und Aufteilung

Achtung: Das Schreiben einer Partitionstabelle (w in fdisk, mklabel in parted) macht vorhandene Daten auf dieser Platte unerreichbar. Prüf vorher den Gerätenamen mit lsblk; /dev/sda und /dev/sdb vertauschen sich leicht.

mkfs

Partition formatieren

GefährlichLinux#
sudo mkfs.<type> device
sudo mkfs.ext4 -L data /dev/sdb1

ext4 mit Label

sudo mkfs.vfat -F 32 /dev/sdc1

FAT32 für einen USB-Stick, den andere Geräte lesen können

Achtung: Löscht das Dateisystem auf dem Ziel sofort, ohne Rückfrage, wenn das Gerät nicht eingehängt ist. Prüf das Gerät mit lsblk -f; wer /dev/sda statt /dev/sda1 oder die falsche Platte formatiert, zerstört sie.

fsck

Dateisystem prüfen und reparieren

GefährlichLinux#
sudo fsck [-f] device
sudo fsck -f /dev/sdb1

vollständige Prüfung einer ausgehängten Partition erzwingen

Achtung: Führ fsck nie auf einem mit Schreibzugriff eingehängten Dateisystem aus: Es kann es beschädigen. Erst aushängen, oder beim Root-Dateisystem von einem Rettungsmedium booten.

dd

ISO auf einen USB-Stick schreiben oder Rohdaten einer Platte kopieren

GefährlichLinux · macOS#
dd if=input of=output bs=size [status=progress] [conv=fsync]
if= / of=
Eingabe- / Ausgabedatei oder -gerät
bs=4M
Blockgröße; größer ist schneller
status=progress
kopierte Bytes anzeigen (GNU)
conv=fsync
vor dem Beenden auf das Gerät schreiben
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync

bootfähigen USB-Stick erstellen (sdX durch die ganze Platte ersetzen, keine Partition)

dd if=/dev/zero of=test.img bs=1M count=100

eine 100-MB-Datei erstellen

Achtung: dd überschreibt das Ziel bei of= ohne Rückfrage. Vertauschst du if= und of= oder wählst das falsche /dev/sdX, wird diese Platte gelöscht. Prüf es direkt vor dem Ausführen mit lsblk.

macOS/BSD: macOS: Ziel ist /dev/rdiskN (aus diskutil list) nach diskutil unmountDisk, nimm bs=4m und drück Ctrl+T für den Fortschritt.

sync

Ausstehende Schreibvorgänge auf die Platte schreiben

Linux · macOS#
sync
sync && sudo umount /mnt/usb

bevor du ein USB-Laufwerk abziehst

swapon / mkswap

Swap prüfen oder hinzufügen

Linux#
swapon --show | mkswap file && swapon file
swapon --show

aktueller Swap

sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile

eine 2-GB-Swap-Datei hinzufügen (in /etc/fstab eintragen, damit sie bleibt)

Unter Btrfs braucht eine Swap-Datei zusätzliche Schritte (btrfs filesystem mkswapfile bei aktuellen btrfs-progs).

shred

Datei vor dem Löschen überschreiben

GefährlichLinux#
shred [-u] [-n passes] file
shred -u -n 3 secrets.txt

dreimal überschreiben, dann löschen

Achtung: Unumkehrbar. Außerdem nicht zuverlässig auf SSDs, Journaling- oder Copy-on-Write-Dateisystemen (Btrfs, ZFS) oder bei Snapshots; echten Schutz bietet Vollverschlüsselung.

Netzwerk

IP-Adressen, Routen, offene Ports, HTTP-Anfragen, DNS, SSH und Dateiübertragung.

ip addr

IP-Adressen dieses Rechners anzeigen

Linux#
ip [-br] addr [show dev IFACE]
ip -br a

eine Zeile pro Schnittstelle: Name, Status, Adressen

ip a show eth0

eine Schnittstelle im Detail

hostname -I

nur die IP-Adressen

macOS/BSD: macOS: ifconfig oder ipconfig getifaddr en0.

ip ersetzt das alte ifconfig (net-tools), das viele Distributionen nicht mehr installieren.

ip route

Routingtabelle und Standardgateway anzeigen

Linux#
ip route [get ADDRESS] | ip route add NET via GW
ip r

Routen; „default via“ ist das Gateway

ip route get 1.1.1.1

welche Schnittstelle und welches Gateway ein Ziel nutzt

sudo ip route add 10.20.0.0/16 via 192.168.1.1

eine Route hinzufügen (geht beim Neustart verloren)

ip link

Netzwerkschnittstelle aktivieren oder deaktivieren

GefährlichLinux#
ip link [set IFACE up|down]
ip link

Schnittstellen und MAC-Adressen

sudo ip link set eth0 down && sudo ip link set eth0 up

eine Schnittstelle neu starten

Achtung: Deaktivierst du die Schnittstelle, über die du per SSH verbunden bist, bricht deine Sitzung ab.

ss

Lauschende Ports und offene Verbindungen auflisten

Linux#
ss [-t] [-u] [-l] [-p] [-n]
-t / -u
TCP / UDP
-l
nur lauschende Sockets
-p
den Prozess anzeigen (sudo, um die anderer Benutzer zu sehen)
-n
numerische Ports, kein DNS
-s
zusammenfassende Zahlen
sudo ss -tulpn

jeder lauschende Port und sein Programm

ss -tn state established '( dport = :443 )'

bestehende Verbindungen zu Port 443

ss -s

Verbindungssummen

macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P oder netstat -an.

ss ersetzt netstat; netstat -tulpn funktioniert noch, wo net-tools installiert ist.

curl

HTTP-Anfrage senden oder Datei herunterladen

Linux · macOS#
curl [options] URL
-I
nur Header (HEAD-Anfrage)
-L
Weiterleitungen folgen
-o file / -O
in eine Datei speichern / mit dem entfernten Namen speichern
-s / -S
still / aber Fehler trotzdem anzeigen
-f
bei HTTP 4xx/5xx fehlschlagen (Exit 22), statt die Fehlerseite auszugeben
-v
ausführlich: Anfrage- und Antwort-Header, TLS
curl -I https://example.com

Statuszeile und Header

curl -LO https://example.com/file.tar.gz

herunterladen und Weiterleitungen folgen

curl -s -o /dev/null -w '%{http_code}\n' https://example.com

nur der Statuscode

curl -fsSL https://example.com/install.sh -o install.sh

ein Skript herunterladen, um es vor dem Ausführen zu lesen

curl -d

POST-Anfrage mit JSON senden

Linux · macOS#
curl -H 'Content-Type: application/json' -d 'json' URL
-d data
Anfrage-Body; impliziert POST
--data-binary @file
eine Datei unverändert senden
-H header
einen Header hinzufügen
-X METHOD
PUT, PATCH, DELETE…
-u user:pass
Basic Auth
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/users

JSON per POST

curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me

doppelte Anführungszeichen, damit $TOKEN ersetzt wird

curl -X DELETE https://api.example.com/users/42

andere Methoden

wget

Dateien herunterladen (mit Fortsetzen)

Linux#
wget [options] URL
-c
abgebrochenen Download fortsetzen
-O file
speichern unter (-O- für stdout)
-q
still
-r -np
rekursiv, nie ins übergeordnete Verzeichnis aufsteigen
wget -c https://example.com/big.iso

nach Verbindungsabbruch fortsetzen

wget -qO- https://example.com/data.json | jq .

direkt per Pipe an einen anderen Befehl

macOS/BSD: Nicht im Standard-macOS; nimm curl -LO (curl -C - -LO zum Fortsetzen).

dig

DNS-Einträge abfragen

Linux · macOS#
dig [@server] name [type] [+short]
dig +short example.com

nur die A-Einträge

dig MX example.com

Mailserver

dig @1.1.1.1 example.com

einen bestimmten Resolver fragen (lokalen Cache umgehen)

dig -x 8.8.8.8

Reverse-Lookup

dig +trace example.com

der Delegation ab der Root folgen

Paketname: dnsutils (Debian/Ubuntu) oder bind-utils (Fedora/RHEL).

host / nslookup

Schnelle DNS-Abfrage

Linux · macOS#
host name | nslookup name [server]
host example.com

A, AAAA und MX in einer kurzen Antwort

nslookup example.com 8.8.8.8

denselben Befehl gibt es unter Windows

resolvectl

Genutzte DNS-Server prüfen und DNS-Cache leeren

Linux#
resolvectl [status|query|flush-caches]
resolvectl status

DNS-Server pro Schnittstelle

sudo resolvectl flush-caches

Cache von systemd-resolved leeren

macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder.

Nur auf Systemen mit systemd-resolved (standardmäßig Ubuntu, Fedora).

ping

Prüfen, ob ein Host erreichbar ist

Linux · macOS#
ping [-c count] [-i interval] host
-c N
nach N Paketen aufhören
-i sec
Intervall zwischen Paketen
-4 / -6
IPv4 / IPv6 erzwingen
ping -c 4 example.com

vier Pakete, dann eine Zusammenfassung

Unter Linux und macOS läuft ping bis Ctrl+C, sofern du kein -c angibst (Windows hört nach 4 auf). Keine Antwort heißt nicht immer, dass er down ist: Viele Hosts blockieren ICMP.

traceroute / tracepath

Route der Pakete zu einem Host anzeigen

Linux · macOS#
traceroute [-n] host | tracepath host
traceroute -n example.com

Hops ohne DNS-Abfragen

tracepath example.com

kein root nötig, meldet auch die MTU

macOS/BSD: macOS hat traceroute, aber kein tracepath.

traceroute muss unter Linux eventuell installiert werden; tracepath (iputils) ist meist vorhanden.

mtr

Herausfinden, wo Paketverlust entsteht

Linux#
mtr [-r] [-w] [-c count] host
mtr -rw -c 100 example.com

Bericht nach 100 Proben pro Hop

Kombiniert ping und traceroute. Verlust nur an einem Hop in der Mitte liegt meist daran, dass dieser Router ICMP niedrig priorisiert; Verlust, der bis zum Ende anhält, ist echt.

ssh

Auf einem entfernten Rechner anmelden

Linux · macOS#
ssh [-p port] [-i key] [-J jump] user@host [command]
ssh alice@203.0.113.10

anmelden

ssh -p 2222 alice@host

abweichender Port

ssh alice@host 'df -h'

einen Befehl ausführen und zurückkehren

ssh -J bastion.example.com alice@10.0.0.5

über einen Bastion-Host springen

ssh -L / -R / -D

Port über SSH weiterleiten (Tunnel)

Linux · macOS#
ssh -L local:host:remote user@server
-L 5432:localhost:5432
lokaler Port 5432 erreicht Port 5432 auf dem Server
-R 8080:localhost:3000
Server-Port 8080 erreicht deinen lokalen Port 3000
-D 1080
SOCKS-Proxy auf lokalem Port 1080
-N
kein entfernter Befehl, nur der Tunnel
ssh -N -L 5432:localhost:5432 alice@db-host

deinen lokalen DB-Client mit einem entfernten Postgres verbinden

ssh -N -D 1080 alice@host

über den Server surfen

ssh-keygen

SSH-Schlüssel erstellen und auf einem Server hinterlegen

Linux · macOS#
ssh-keygen -t ed25519 [-C comment] | ssh-copy-id user@host
ssh-keygen -t ed25519 -C "you@example.com"

neues Schlüsselpaar in ~/.ssh

ssh-copy-id alice@host

deinen öffentlichen Schlüssel an die authorized_keys des Servers anhängen

ssh-keygen -R host

alten Host-Schlüssel nach Neuaufsetzen eines Servers entfernen („REMOTE HOST IDENTIFICATION HAS CHANGED“)

~/.ssh/config

SSH-Verbindungsdaten als kurzen Alias speichern

Linux · macOS#
Host alias / HostName / User / Port / IdentityFile
Host web
  HostName 203.0.113.10
  User deploy
  Port 2222
  IdentityFile ~/.ssh/id_ed25519

dann einfach: ssh web (scp und rsync nutzen es auch)

scp

Dateien per SSH auf einen Server oder von dort kopieren

Linux · macOS#
scp [-r] [-P port] source... dest
-r
Verzeichnisse kopieren
-P port
Port (großes P; ssh nutzt kleines -p)
-i key
Schlüsseldatei
scp report.pdf alice@host:/tmp/

hochladen

scp alice@host:/var/log/app.log .

herunterladen

scp -r -P 2222 site/ alice@host:~/

einen Ordner über einen anderen Port hochladen

Seit OpenSSH 9.0 nutzt scp darunter das SFTP-Protokoll. Bei großen oder wiederholten Kopien ist rsync schneller, weil es nur Änderungen überträgt.

rsync

Ordner lokal oder per SSH synchronisieren

Linux · macOS#
rsync [-avz] [--progress] [-n] source dest
-a
Archiv: rekursiv, behält Berechtigungen, Zeiten, Links
-v
ausführlich
-z
bei der Übertragung komprimieren
-P
Fortschritt und Fortsetzen abgebrochener Dateien
-n
Probelauf: zeigen, was passieren würde
--exclude 'pattern'
Dateien überspringen
-e 'ssh -p 2222'
eigene SSH-Optionen
rsync -avzP site/ deploy@host:/srv/site/

Schrägstrich am Ende von site/ kopiert den Inhalt, nicht den Ordner selbst

rsync -av --exclude 'node_modules' ./ /backup/app/

lokales Backup ohne Ballast

macOS/BSD: Neuere macOS-Versionen liefern openrsync statt rsync aus; gängige Flags funktionieren, manche seltenere nicht.

src/ bedeutet „der Inhalt von src“; src ohne Schrägstrich bedeutet „der Ordner src“. Wer das verwechselt, verschachtelt Ordner (dest/src/…).

rsync --delete

Ziel zu einem exakten Spiegel machen

GefährlichLinux · macOS#
rsync -av --delete source/ dest/
rsync -avn --delete site/ /srv/site/

zuerst Probelauf: Zeilen mit „deleting“ zeigen, was wegfallen würde

rsync -av --delete site/ /srv/site/

dann der echte Lauf

Achtung: Löscht alles im Ziel, was nicht in der Quelle ist. Vertauschte Quelle und Ziel oder ein leerer/falscher Quellpfad leeren das Ziel. Immer zuerst mit -n ausführen.

nc

Prüfen, ob ein TCP-Port offen ist

Linux · macOS#
nc -zv host port | nc -l port
nc -zv db.internal 5432

„succeeded“ oder „Connection refused“/Timeout

nc -l 9000

auf einem Port lauschen, um eine Firewall von der anderen Seite zu testen

Die Flags unterscheiden sich zwischen netcat-Varianten: Die traditionelle braucht nc -l -p 9000.

ufw

Firewall unter Ubuntu verwalten

GefährlichLinux#
sudo ufw [status|allow|deny|delete|enable]
sudo ufw status verbose

Regeln und Standardrichtlinie

sudo ufw allow 22/tcp

SSH erlauben (vor enable erledigen)

sudo ufw allow from 10.0.0.0/8 to any port 5432

ein Port, ein Netz

Achtung: sudo ufw enable auf einem entfernten Server, ohne vorher SSH zu erlauben (ufw allow OpenSSH oder 22/tcp), sperrt dich aus.

firewall-cmd

Firewall unter Fedora/RHEL verwalten

Linux#
sudo firewall-cmd [--permanent] --add-service|--add-port ...
sudo firewall-cmd --list-all

aktive Zone und Regeln

sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload

HTTPS dauerhaft öffnen

sudo firewall-cmd --permanent --add-port=8080/tcp

einen Port öffnen

Ohne --permanent gilt eine Regel nur bis zum nächsten Reload oder Neustart.

nmcli

WLAN und Verbindungen verwalten (NetworkManager)

Linux#
nmcli [device|connection] ...
nmcli device status

Schnittstellen und ob sie verbunden sind

nmcli device wifi list

Netze in der Nähe

nmcli device wifi connect 'MyWiFi' password 'secret'

mit einem Netz verbinden

Pakete: apt, dnf, pacman, zypper

Dieselbe Aufgabe in den vier wichtigsten Paketmanagern: Debian/Ubuntu (apt), Fedora/RHEL (dnf), Arch (pacman), openSUSE (zypper). Stell allem, was das System verändert, sudo voran.

Aufgabeapt (Debian, Ubuntu)dnf (Fedora, RHEL)pacman (Arch)zypper (openSUSE)
Paketlisten aktualisieren #
dnf aktualisiert automatisch, wenn die Metadaten veraltet sind. Unter Arch nie pacman -Sy und danach -S pkg ausführen: Teil-Upgrades werden nicht unterstützt; nimm -Syu.
apt update
dnf makecache
pacman -Sy
zypper refresh
Alles aktualisieren #
openSUSE Tumbleweed nutzt zypper dup. apt full-upgrade entfernt bei Bedarf auch Pakete, um das Upgrade abzuschließen.
apt update && apt upgrade
dnf upgrade
pacman -Syu
zypper update
Paket installieren #
apt install nginx
dnf install nginx
pacman -S nginx
zypper install nginx
Heruntergeladene Paketdatei installieren #
Das ./ sagt apt, dass es eine Datei ist und kein Paketname, damit Abhängigkeiten aufgelöst werden (dpkg -i macht das nicht).
apt install ./app.deb
dnf install ./app.rpm
pacman -U app.pkg.tar.zst
zypper install ./app.rpm
Paket entfernen #
apt remove nginx
dnf remove nginx
pacman -R nginx
zypper remove nginx
Mit Konfigurationsdateien / ungenutzten Abhängigkeiten entfernen #
apt purge nginx && apt autoremove
dnf remove nginx && dnf autoremove
pacman -Rns nginx
zypper remove --clean-deps nginx
Paketdetails anzeigen #
apt show nginx
dnf info nginx
pacman -Si nginx (installed: -Qi)
zypper info nginx
Installierte Pakete auflisten #
apt list --installed
dnf list --installed
pacman -Q
zypper search --installed-only
Verfügbare Updates auflisten #
apt list --upgradable
dnf check-update
checkupdates (pacman-contrib)
zypper list-updates
Zu welchem Paket eine Datei gehört #
Für noch nicht installierte Dateien: dnf provides /path, apt-file search path (braucht apt-file), pacman -F path.
dpkg -S /usr/bin/curl
rpm -qf /usr/bin/curl
pacman -Qo /usr/bin/curl
rpm -qf /usr/bin/curl
Von einem Paket installierte Dateien auflisten #
dpkg -L nginx
rpm -ql nginx
pacman -Ql nginx
rpm -ql nginx
Paket auf der aktuellen Version halten #
Unter DNF 4 braucht versionlock das Plugin-Paket versionlock.
apt-mark hold nginx
dnf versionlock add nginx
IgnorePkg = nginx in /etc/pacman.conf
zypper addlock nginx
Paket-Cache leeren #
apt clean
dnf clean all
pacman -Sc
zypper clean

Benutzer & Gruppen

Wer du bist, wer angemeldet ist, und Konten verwalten.

whoami / id

Benutzernamen, UID und Gruppen anzeigen

Linux · macOS#
whoami | id [user]
id

uid, gid und alle Gruppen, in denen du bist

id alice

ein anderer Benutzer

who / w / last

Sehen, wer angemeldet ist, und letzte Anmeldungen

Linux · macOS#
who | w | last [-n N]
w

wer angemeldet ist und was er ausführt

last -n 10

letzte Anmeldungen und Neustarts

sudo lastb -n 10

letzte fehlgeschlagene Anmeldungen (Linux)

useradd

Benutzerkonto anlegen

Linux#
sudo useradd [-m] [-s shell] [-G groups] user
-m
Home-Verzeichnis anlegen (nicht auf jeder Distribution Standard)
-s /bin/bash
Login-Shell
-G group1,group2
zusätzliche Gruppen
sudo useradd -m -s /bin/bash alice && sudo passwd alice

anlegen und Passwort setzen

Unter Debian/Ubuntu ist adduser alice der freundlichere interaktive Wrapper, der Home-Verzeichnis und Passwort einrichtet.

usermod -aG

Benutzer zu einer Gruppe hinzufügen

GefährlichLinux#
sudo usermod -aG group user
sudo usermod -aG docker alice

alice darf docker ausführen

sudo usermod -aG sudo alice

Admin unter Debian/Ubuntu (unter Fedora/RHEL/Arch heißt die Gruppe wheel)

Achtung: Ohne -a ersetzt usermod -G alle zusätzlichen Gruppen des Benutzers, was den sudo-Zugriff entfernen kann. Gruppenänderungen greifen bei der nächsten Anmeldung (oder führ newgrp docker aus).

userdel

Benutzerkonto löschen

GefährlichLinux#
sudo userdel [-r] user
sudo userdel -r olduser

entfernt auch Home-Verzeichnis und Mail-Spool

Achtung: -r löscht das Home-Verzeichnis samt Dateien endgültig. Sichere es vorher oder sperre stattdessen das Konto (passwd -l).

passwd

Passwort ändern oder Konto sperren

Linux#
passwd [user] | passwd -l|-u user
passwd

dein eigenes ändern

sudo passwd alice

das eines anderen zurücksetzen

sudo passwd -l alice

Anmeldung per Passwort sperren (SSH-Schlüssel funktionieren eventuell weiter)

groupadd / gpasswd

Gruppe anlegen oder Benutzer aus einer entfernen

Linux#
sudo groupadd name | sudo gpasswd -d user group
sudo groupadd developers

neue Gruppe

sudo gpasswd -d alice developers

alice daraus entfernen

groups / getent

Mitglieder einer Gruppe oder Gruppen eines Benutzers auflisten

Linux#
groups [user] | getent group name
groups alice

die Gruppen von alice

getent group sudo

Mitglieder von sudo (funktioniert auch mit LDAP)

getent passwd alice

Kontoeintrag: UID, Home, Shell

visudo

Einem Benutzer sicher sudo-Rechte geben

Linux · macOS#
sudo visudo [-f /etc/sudoers.d/file]
sudo visudo -f /etc/sudoers.d/deploy

eigene Datei pro Regel

deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

ein Befehl ohne Passwort

visudo prüft die Syntax vor dem Speichern. Wer /etc/sudoers mit einem normalen Editor bearbeitet und sich vertippt, kann alle von sudo aussperren.

chage

Passwortablauf prüfen oder festlegen

Linux#
sudo chage [-l] [-M days] user
sudo chage -l alice

letzte Änderung und Ablaufdaten

sudo chage -M 90 alice

alle 90 Tage ablaufen lassen

Archive & Komprimierung

tar, gzip, xz, zip und Prüfsummen.

tar -c

.tar.gz-Archiv erstellen

Linux · macOS#
tar -czf archive.tar.gz files...
-c
erstellen
-z / -j / -J
Komprimierung mit gzip / bzip2 / xz
-f file
Name der Archivdatei (direkt nach f angeben)
-v
Dateien beim Hinzufügen auflisten
--exclude='pattern'
Dateien auslassen
tar -czf site-2026-10-18.tar.gz site/

gzip-komprimiertes Archiv eines Ordners

tar -cJf logs.tar.xz --exclude='*.tmp' logs/

kleineres xz-Archiv ohne temporäre Dateien

tar -x

.tar.gz, .tar.xz oder .tar.bz2 entpacken

Linux · macOS#
tar -xf archive [-C dir]
-x
entpacken
-C dir
nach dir entpacken (muss existieren)
--strip-components=1
den obersten Ordner weglassen
tar -xf archive.tar.gz

GNU tar und macOS-tar erkennen die Komprimierung selbst

tar -xzf app.tar.gz -C /opt/app --strip-components=1

in einen Ordner, ohne das umschließende Verzeichnis

tar -t

Archiv auflisten oder eine Datei daraus entpacken

Linux · macOS#
tar -tf archive | tar -xf archive path/in/archive
tar -tf backup.tar.gz | less

Inhalt ansehen, ohne zu entpacken

tar -xf backup.tar.gz etc/nginx/nginx.conf

eine Datei herausholen (Pfad wie von -t angezeigt)

tar --zstd

Schnelle Komprimierung mit zstd

Linux · macOS#
tar --zstd -cf archive.tar.zst files...
tar --zstd -cf data.tar.zst data/

viel schneller als xz, Verhältnis ähnlich wie gzip -9 oder besser

zstd -d file.zst

eine einzelne Datei entpacken

Braucht GNU tar 1.31+ (oder ein aktuelles bsdtar) und das Programm zstd.

gzip / gunzip

Einzelne Datei komprimieren oder entpacken

Linux · macOS#
gzip [-k] [-d] [-9] file
-k
Original behalten
-d
entpacken (wie gunzip)
-9
beste Komprimierung
gzip -k access.log

erzeugt access.log.gz und behält das Original

zcat access.log.gz | grep 404

lesen, ohne auf die Platte zu entpacken

zgrep 500 access.log.*.gz

rotierte Logs direkt durchsuchen

Ohne -k ersetzt gzip die Datei durch die .gz-Version.

xz / bzip2

Stärkere Komprimierung für einzelne Dateien

Linux#
xz [-T0] [-9] [-d] file | bzip2 [-d] file
xz -T0 -k big.sql

alle CPU-Kerne, Original behalten

unxz big.sql.xz

entpacken

zip

.zip-Datei erstellen

Linux · macOS#
zip -r archive.zip files... [-x pattern]
zip -r site.zip site/

einen Ordner zippen

zip -r site.zip site/ -x '*.git*' '*/node_modules/*'

Pfade ausschließen

zip -e verschlüsselt mit dem veralteten ZipCrypto-Verfahren, das schwach ist. Für echte Geheimhaltung nimm 7z oder gpg.

unzip

.zip-Datei entpacken

Linux · macOS#
unzip [-l] [-o] archive.zip [-d dir]
unzip files.zip -d files/

in einen Ordner

unzip -l files.zip

nur den Inhalt auflisten

unzip -o files.zip

ohne Rückfrage überschreiben

7z

Mit .7z- (und den meisten anderen) Archiven arbeiten

Linux#
7z a|x|l archive [files]
7z x archive.7z

mit vollständigen Pfaden entpacken

7z a -p backup.7z docs/

AES-256-verschlüsseltes Archiv (fragt nach einem Passwort)

7z l archive.rar

Inhalt vieler Formate auflisten

Paket: p7zip-full / 7zip unter Debian/Ubuntu, p7zip oder 7zip unter Fedora/Arch.

sha256sum

Download per Prüfsumme verifizieren

Linux#
sha256sum file | sha256sum -c SUMSFILE
sha256sum ubuntu.iso

mit dem Hash auf der Downloadseite vergleichen

sha256sum -c SHA256SUMS --ignore-missing

jede aufgeführte Datei prüfen, die du tatsächlich hast

macOS/BSD: macOS: shasum -a 256 file (und shasum -a 256 -c SUMSFILE).

split

Große Datei in Teile aufteilen und wieder zusammenfügen

Linux · macOS#
split -b size file prefix
split -b 100M backup.tar.gz backup.part.

backup.part.aa, .ab, …

cat backup.part.* > backup.tar.gz

wieder zusammenfügen

Textverarbeitung

Text und JSON zerschneiden, filtern, sortieren, zählen, umwandeln und umformen.

sed s///

Text suchen und ersetzen

Linux · macOS#
sed 's/old/new/[g]' file
g
jeden Treffer in der Zeile ersetzen, nicht nur den ersten
-E
erweiterter regulärer Ausdruck (Gruppen ohne Backslashes)
I
ohne Beachtung von Groß-/Kleinschreibung (GNU)
sed 's/http:/https:/g' links.txt

Ergebnis ausgeben; die Datei bleibt unverändert

sed 's|/usr/local|/opt|g' paths.txt

beliebiges Trennzeichen, praktisch für Pfade

sed -E 's/([0-9]+)px/\1rem/g' style.css

eine erfasste Gruppe wiederverwenden

sed -i

Datei direkt bearbeiten

Linux · macOS#
sed -i[SUFFIX] 's/old/new/g' file
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config

GNU sed

sed -i.bak 's/foo/bar/g' config.ini

behält config.ini.bak; funktioniert mit GNU und macOS

macOS/BSD: sed unter macOS verlangt ein Argument nach -i: sed -i '' 's/foo/bar/g' file. GNU sed liest '' als Skript, die einzige Form, die in beiden funktioniert, ist also -i.bak.

sed -n / d

Bestimmte Zeilen ausgeben oder löschen

Linux · macOS#
sed -n 'Np' | sed '/regex/d'
sed -n '100,120p' big.log

Zeilen 100 bis 120

sed '/^\s*#/d; /^$/d' app.conf

Kommentare und Leerzeilen entfernen (GNU \s)

sed -n '/BEGIN CERT/,/END CERT/p' bundle.pem

alles zwischen zwei Markierungen

awk

Bestimmte Spalten ausgeben

Linux · macOS#
awk [-F sep] '{print $N}' file
-F sep
Feldtrenner (Standard: Folgen von Leerzeichen/Tabs)
$1 … $NF
Felder; $NF ist das letzte, $0 die ganze Zeile
NR
Zeilennummer
awk '{print $1}' access.log

erste Spalte (Client-IP)

awk -F: '{print $1, $7}' /etc/passwd

Benutzer und Shell

awk -F, 'NR>1 {print $2}' data.csv

zweite CSV-Spalte, Kopfzeile überspringen (nur einfache CSV: keine Kommas in Anführungszeichen)

awk (filter & sum)

Zeilen filtern und eine Spalte summieren

Linux · macOS#
awk 'condition {action} END {action}' file
awk '$9 >= 500' access.log

Zeilen, in denen Feld 9 (Status) 5xx ist

awk '{s += $2} END {print s}' sales.txt

Summe von Spalte 2

awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | head

Anzahl pro Wert, Top 10

cut

Felder anhand eines einzelnen Trennzeichens ausschneiden

Linux · macOS#
cut -d DELIM -f LIST | cut -c RANGE
cut -d, -f1,3 data.csv

Spalten 1 und 3

cut -d: -f1 /etc/passwd

alle Benutzernamen

cut -c1-10 file

die ersten 10 Zeichen jeder Zeile

cut behandelt jedes Trennzeichen als Feldgrenze, zwei Leerzeichen ergeben also ein leeres Feld. Für mit Leerzeichen ausgerichtete Ausgabe nimm awk.

sort

Zeilen sortieren

Linux · macOS#
sort [-n] [-r] [-h] [-k N,N] [-t sep] [-u] file
-n
numerisch
-r
umgekehrt
-h
lesbare Größen: 2K < 1M < 3G
-k 2,2
nur nach Feld 2 sortieren
-t ,
Feldtrenner
-u
Duplikate entfernen
-V
Versionsreihenfolge: 1.9 < 1.10
du -sh * | sort -h

Ordner nach Größe

sort -t, -k3,3nr data.csv

CSV nach Spalte 3, numerisch, absteigend

sort -u emails.txt > unique.txt

sortiert und ohne Duplikate

uniq

Doppelte Zeilen zählen oder entfernen

Linux · macOS#
sort file | uniq [-c] [-d] [-u]
-c
jeder Zeile ihre Anzahl voranstellen
-d
nur Zeilen, die sich wiederholen
-u
nur Zeilen, die einmal vorkommen
sort ips.txt | uniq -c | sort -rn | head

die 10 häufigsten Zeilen

uniq fasst nur aufeinanderfolgende Duplikate zusammen, also vorher sortieren.

wc

Zeilen, Wörter oder Bytes zählen

Linux · macOS#
wc [-l] [-w] [-c] [-m] file...
wc -l access.log

Anzahl der Zeilen

ls | wc -l

wie viele Einträge dieser Ordner hat

grep -c '' file

Zeilenzahl, die auch eine letzte Zeile ohne Zeilenumbruch mitzählt

tr

Zeichen ersetzen oder löschen

Linux · macOS#
tr [-d] [-s] 'set1' ['set2']
tr 'a-z' 'A-Z' < in.txt

in Großbuchstaben

tr -d '\r' < windows.txt > unix.txt

Windows-Zeilenenden (CRLF) entfernen

tr -s ' ' < file

wiederholte Leerzeichen zusammenfassen

tr '\n' ',' < list.txt

Zeilen mit Kommas verbinden

tr liest nur die Standardeingabe, leite die Datei also mit < hinein.

xargs

Eingabezeilen in Befehlsargumente umwandeln

Linux · macOS#
command | xargs [-0] [-n N] [-P N] [-I {}] cmd
-0
Eingabe ist NUL-getrennt (mit find -print0 kombinieren); sicher bei Leerzeichen
-n N
höchstens N Argumente pro Befehl
-P N
N Befehle parallel ausführen
-I {}
{} durch jede Eingabezeile ersetzen
-r
Befehl nicht ausführen, wenn die Eingabe leer ist (GNU)
find . -name '*.log' -print0 | xargs -0 rm -f

gefundene Dateien sicher löschen

cat urls.txt | xargs -n 1 -P 4 curl -sO

4 gleichzeitig herunterladen

ls *.png | xargs -I {} cp {} /backup/{}

ein Befehl pro Element

macOS/BSD: GNU xargs führt den Befehl auch bei leerer Eingabe einmal aus, außer du gibst -r an; xargs unter macOS überspringt leere Eingaben standardmäßig und akzeptiert -r aus Kompatibilitätsgründen.

jq

JSON lesen und filtern

Linux · macOS#
jq [-r] 'filter' file
.
schön formatiert ausgeben
-r
rohe Strings, ohne Anführungszeichen
-c
kompakt, eine Zeile pro Ergebnis
.[]
über ein Array iterieren
select(cond)
passende Elemente behalten
jq . response.json

schön formatiert ausgeben

jq -r '.items[].name' data.json

ein Name pro Zeile

jq -r '.[] | select(.active) | .email' users.json

filtern, dann ein Feld auswählen

curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'

direkt aus einer API

Installieren mit apt/dnf install jq. Bei aktuellem macOS dabei.

paste

Zeilen verbinden oder Dateien nebeneinander zusammenführen

Linux · macOS#
paste [-s] [-d delim] file...
paste -sd, ids.txt

alle Zeilen mit Kommas verbunden

paste names.txt emails.txt

zwei Dateien als zwei Spalten

comm

Zeilen, die zwei Listen gemeinsam haben (oder nur in einer stehen)

Linux · macOS#
comm [-1] [-2] [-3] sorted1 sorted2
comm -12 <(sort a.txt) <(sort b.txt)

in beiden

comm -23 <(sort a.txt) <(sort b.txt)

nur in a.txt

seq

Zahlenfolge erzeugen

Linux · macOS#
seq [first [step]] last
seq 1 5

1 bis 5, eine pro Zeile

seq -w 1 10

mit führenden Nullen: 01 … 10

for i in $(seq 1 3); do echo "run $i"; done

Schleifenzähler

base64

Base64 kodieren oder dekodieren

Linux · macOS#
base64 [-d] [-w 0] [file]
printf '%s' 'user:pass' | base64

kodieren (printf vermeidet einen abschließenden Zeilenumbruch)

echo dXNlcjpwYXNz | base64 -d

dekodieren

base64 -w 0 image.png > image.b64

ohne Zeilenumbruch (GNU bricht nach 76 Zeichen um)

macOS/BSD: base64 unter macOS bricht standardmäßig nicht um und hat kein -w. Zum Dekodieren -d verwenden (ältere macOS-Versionen nutzten -D).

iconv

Textkodierung umwandeln (z. B. in UTF-8)

Linux · macOS#
iconv -f FROM -t TO file
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csv

Zeichensalat aus Excel-Exporten beheben

iconv -l

unterstützte Kodierungen auflisten

shuf

Zeilen mischen oder zufällig auswählen

Linux#
shuf [-n N] file
shuf -n 1 names.txt

eine zufällige Zeile

shuf -i 1-100 -n 5

fünf Zufallszahlen von 1 bis 100

Dienste & Logs

systemd-Dienste: starten, stoppen, beim Booten aktivieren und ihre Logs mit journalctl lesen.

systemctl status

Prüfen, ob ein Dienst läuft

Linux#
systemctl status|is-active|is-enabled unit
systemctl status nginx

Zustand, PID, Speicher und die letzten Logzeilen

systemctl is-active --quiet nginx && echo up

für Skripte

systemctl start

Dienst starten, stoppen, neu starten oder neu laden

Linux#
sudo systemctl start|stop|restart|reload unit
sudo systemctl restart nginx

vollständiger Neustart

sudo systemctl reload nginx

Konfiguration neu einlesen, ohne Verbindungen zu trennen (sofern der Dienst das unterstützt)

Teste die Konfiguration nach Möglichkeit vor dem Neustart, z. B. mit sudo nginx -t, damit ein Tippfehler die Website nicht lahmlegt.

systemctl enable

Dienst beim Booten starten (oder das verhindern)

Linux#
sudo systemctl enable|disable [--now] unit
sudo systemctl enable --now docker

beim Booten aktivieren und jetzt starten

sudo systemctl disable --now cups

jetzt und beim Booten stoppen

sudo systemctl mask bluetooth

das Starten komplett verhindern (unmask macht es rückgängig)

systemctl list-units

Laufende und fehlgeschlagene Dienste auflisten

Linux#
systemctl list-units [--type=service] [--state=…] | systemctl --failed
systemctl --failed

was kaputt ist

systemctl list-units --type=service --state=running

was läuft

systemctl list-unit-files --state=enabled

was beim Booten startet

systemctl edit

Service-Unit ändern (und systemd neu laden)

Linux#
sudo systemctl edit unit | sudo systemctl daemon-reload
sudo systemctl edit nginx

Drop-in-Override, das Paket-Upgrades übersteht

systemctl cat nginx

die Unit samt allen Overrides

sudo systemctl daemon-reload

nötig, nachdem Unit-Dateien von Hand bearbeitet wurden

.service file

Eigene App als Dienst laufen lassen

Linux#
/etc/systemd/system/<name>.service
[Unit]
Description=My app
After=network.target

[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure

[Install]
WantedBy=multi-user.target

danach: sudo systemctl daemon-reload && sudo systemctl enable --now myapp

journalctl

Dienst- und Systemlogs lesen

Linux#
journalctl [-u unit] [-f] [-n N] [--since …] [-p level] [-b]
-u unit
ein Dienst
-f
folgen
-n N
letzte N Zeilen
--since '1 hour ago'
auch: today, yesterday, 2026-10-18 09:00
-p err
Priorität err und schlimmer
-b / -b -1
dieser Bootvorgang / vorheriger Bootvorgang
-e
ans Ende springen
journalctl -u nginx -f

einem Dienst folgen

journalctl -u myapp --since '10 min ago'

jüngster Zeitraum

journalctl -b -1 -p err

Fehler aus dem Bootvorgang vor dem Absturz

journalctl --vacuum

systemd-Journal verkleinern

Linux#
journalctl --disk-usage | sudo journalctl --vacuum-size=SIZE | --vacuum-time=TIME
journalctl --disk-usage

wie viel Platz die Logs belegen

sudo journalctl --vacuum-size=500M

höchstens 500 MB archivierte Logs behalten

sudo journalctl --vacuum-time=14d

archivierte Logs löschen, die älter als zwei Wochen sind

Für ein dauerhaftes Limit SystemMaxUse= in /etc/systemd/journald.conf setzen.

/var/log

Klassische Logdateien finden

Linux#
sudo tail -f /var/log/<file>
sudo tail -f /var/log/syslog

allgemeines Log unter Debian/Ubuntu (/var/log/messages unter Fedora/RHEL)

sudo tail -f /var/log/auth.log

Anmeldungen und sudo unter Debian/Ubuntu (/var/log/secure unter RHEL)

Manche Distributionen (Fedora, Arch) speichern Logs nur im Journal, sofern rsyslog nicht installiert ist.

shutdown / reboot

Neu starten oder ausschalten

Linux#
sudo shutdown -r|-h [now|+min|hh:mm] [message] | sudo reboot
sudo reboot

sofort neu starten

sudo shutdown -r +10 'Kernel update'

in 10 Minuten neu starten und angemeldete Benutzer warnen

sudo shutdown -c

geplantes Herunterfahren abbrechen

sudo shutdown -h now

ausschalten

Zeitplanung: cron, at, Timer

Befehle nach Zeitplan oder einmalig später ausführen.

cron syntax

Eine Cron-Zeitplanzeile schreiben

Linux · macOS#
minute hour day-of-month month day-of-week command
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

täglich um 02:30, Ausgabe behalten

*/15 * * * * /usr/local/bin/check.sh

alle 15 Minuten

0 9 * * 1-5 /usr/local/bin/report.sh

09:00 Montag bis Freitag

@reboot /usr/local/bin/startup.sh

einmal beim Booten

Cron läuft mit minimalem PATH und ohne Shell-Profil: Nutze absolute Pfade. Ein % im Befehl muss als \% escapt werden.

crontab -r

Deine Crontab entfernen (Vorsicht)

GefährlichLinux · macOS#
crontab -r
crontab -l > ~/crontab.bak && crontab -r

vor dem Entfernen sichern

crontab ~/crontab.bak

aus einer Datei wiederherstellen

Achtung: Löscht ohne Rückfrage alle deine Cron-Jobs, und r liegt auf der Tastatur direkt neben e. Manche Cron-Implementierungen bieten -i, um vorher zu fragen (crontab -ri).

/etc/cron.d

Systemweite Cron-Jobs

Linux#
/etc/crontab, /etc/cron.d/*, /etc/cron.{hourly,daily,weekly,monthly}/
0 3 * * * root /usr/local/bin/cleanup.sh

Zeile in /etc/cron.d/cleanup: Achtung, zusätzliches Benutzerfeld

ls /etc/cron.daily/

Skripte, die run-parts einmal täglich ausführt

Unter Debian und Ubuntu werden Dateien in /etc/cron.d ignoriert, deren Namen einen Punkt enthalten; nenn sie also backup, nicht backup.cron.

at

Befehl einmalig zu einem späteren Zeitpunkt ausführen

Linux#
at TIME | atq | atrm N
echo 'systemctl restart myapp' | sudo at 02:00

heute Nacht um 2 Uhr

echo './report.sh' | at now + 30 minutes

in einer halben Stunde

atq

ausstehende Jobs

atrm 3

Job 3 abbrechen

Braucht das Paket at und einen laufenden atd-Dienst.

systemd timers

Mit systemd-Timern statt cron planen

Linux#
systemctl list-timers | <name>.timer with OnCalendar=
systemctl list-timers

alle Timer und wann sie das nächste Mal auslösen

[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true

[Install]
WantedBy=timers.target

backup.timer neben backup.service; Persistent holt nach Ausfallzeiten nach

systemd-analyze calendar 'Mon..Fri 09:00'

prüfen, was ein OnCalendar-Ausdruck bedeutet

sleep

Vor dem nächsten Befehl warten

Linux · macOS#
sleep N[s|m|h|d]
sleep 5 && curl -s localhost:8080/health

einem Dienst Zeit zum Starten geben

sleep 2m

Suffixe funktionieren mit GNU und aktuellem macOS

Shell-Grundlagen (bash)

Pipes, Umleitungen, Globbing, Variablen, Verlauf und die Tasten, die am meisten Zeit sparen. macOS nutzt standardmäßig zsh: Fast alles hier funktioniert auch dort, außer shopt, help und Funktionen von bash 4 (macOS liefert bash 3.2 aus).

|

Ausgabe eines Befehls an einen anderen weiterleiten

Linux · macOS#
command1 | command2
ps aux | grep nginx

eine Liste filtern

history | grep 'docker run'

einen früher ausgeführten Befehl finden

set -o pipefail

in Skripten: Eine Pipeline schlägt fehl, wenn irgendein Teil fehlschlägt, nicht nur der letzte

> and >>

Ausgabe in eine Datei speichern (überschreiben oder anhängen)

Linux · macOS#
command > file | command >> file
ls -l > listing.txt

überschreiben (legt die Datei an)

echo 'done' >> progress.log

anhängen

set -o noclobber

> verweigert das Überschreiben vorhandener Dateien (>| erzwingt es)

Die Shell leert die Datei, bevor der Befehl läuft, daher bleibt bei sort file > file eine leere Datei übrig. Schreib in einen neuen Namen und dann mv.

2> and 2>&1

Fehler umleiten, oder Fehler und Ausgabe zusammen

Linux · macOS#
command 2> err.log | command > all.log 2>&1 | command &> all.log
find / -name x 2>/dev/null

Fehlermeldungen verwerfen

./build.sh > build.log 2>&1

Ausgabe und Fehler in einer Datei (Reihenfolge zählt: erst >, dann 2>&1)

./build.sh &> build.log

bash-Kurzform dafür

<, <<EOF, <<<

Eingabe aus einer Datei, einem Textblock oder einem String übergeben

Linux · macOS#
command < file | command <<'EOF' … EOF | command <<< "string"
mysql mydb < dump.sql

Datei als Eingabe

cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOF

'EOF' in Anführungszeichen verhindert, dass $Variablen ersetzt werden

grep -c a <<< "banana"

Here-String

&& || ;

Befehle nacheinander ausführen, auch bedingt

Linux · macOS#
a && b | a || b | a ; b
make && sudo make install

nur installieren, wenn der Build erfolgreich war

cd /srv/app || exit 1

ein Skript stoppen, wenn cd fehlschlägt

(cd frontend && npm run build)

Klammern: eine Subshell, dein Verzeichnis ändert sich also nicht

$( ) $(( )) <( )

Ausgabe eines Befehls nutzen oder rechnen

Linux · macOS#
$(command) | $((expression)) | <(command)
echo "Today is $(date +%A)"

Befehlssubstitution

echo $(( 1024 * 4 ))

Ganzzahlarithmetik

diff <(ls dir1) <(ls dir2)

Prozesssubstitution: Ausgabe als temporäre Datei

Backticks `command` sind die alte Form von $(command); $( ) lässt sich verschachteln und liest sich besser.

* ? [ ] { }

Viele Dateien mit Platzhaltern erfassen

Linux · macOS#
* any string | ? one char | [abc] one of | {a,b} each word
ls *.jpg

alle JPGs in diesem Ordner

rm photo-??.png

photo-01.png … photo-99.png

cp config.{yml,yml.bak}

Klammererweiterung: cp config.yml config.yml.bak

shopt -s globstar; ls **/*.md

** passt in beliebiger Tiefe (bash 4+)

Globs erfassen standardmäßig keine Punktdateien (shopt -s dotglob ändert das). Passt nichts, übergibt bash das Muster wörtlich, außer shopt -s nullglob ist gesetzt.

' ' vs " "

Strings und Variablen richtig in Anführungszeichen setzen

Linux · macOS#
'literal' | "expands $var and $(cmd)" | \ escapes one character
echo 'Cost: $5'

einfache Anführungszeichen: nichts wird ersetzt

echo "Home is $HOME"

doppelte Anführungszeichen: Variablen werden ersetzt, Leerzeichen bleiben

cp "$file" "$dest/"

Variablen mit Pfaden immer in Anführungszeichen setzen: Leerzeichen machen sie sonst kaputt

VAR=value

Shell-Variablen setzen und nutzen

Linux · macOS#
name=value (no spaces around =) | "$name" | "${name}"
name="Ada"; echo "Hi $name"

setzen und nutzen

echo "${PORT:-8080}"

Standardwert, wenn nicht gesetzt oder leer

file=report.tar.gz; echo "${file%%.*}" "${file##*/}"

Endung entfernen / Verzeichnis entfernen

echo "${#name}"

Länge des Strings

export

Umgebungsvariablen setzen

Linux · macOS#
export NAME=value | NAME=value command | unset NAME
export NODE_ENV=production

für jedes aus dieser Shell gestartete Programm sichtbar

DEBUG=1 ./app

nur für diesen einen Befehl

printenv | sort

sie auflisten

unset DEBUG

entfernen

Gehen verloren, wenn die Shell beendet wird. Leg exports in ~/.bashrc (interaktive Shells) oder ~/.profile (Login-Shells) ab, damit sie bleiben.

$PATH

Ordner zu deinem PATH hinzufügen

Linux · macOS#
export PATH="dir:$PATH"
echo "$PATH" | tr : '\n'

ein Eintrag pro Zeile

export PATH="$HOME/.local/bin:$PATH"

deinen eigenen bin-Ordner voranstellen (in ~/.bashrc eintragen)

hash -r

zwischengespeicherte Befehlspfade vergessen, nachdem Binärdateien verschoben wurden

alias / source

Abkürzungen anlegen und Shell-Konfiguration neu laden

Linux · macOS#
alias name='command' | source file
alias ll='ls -alF'

in ~/.bashrc eintragen, damit er bleibt

source ~/.bashrc

Änderungen übernehmen, ohne ein neues Terminal zu öffnen (wie . ~/.bashrc)

\ls

das echte ls ausführen und einen Alias umgehen

$?

Prüfen, ob der letzte Befehl erfolgreich war

Linux · macOS#
echo $? (0 = success)
grep -q root /etc/passwd; echo $?

0 gefunden, 1 nicht gefunden, 2 Fehler

set -euo pipefail

am Anfang eines Skripts: bei Fehlern, nicht gesetzten Variablen und fehlgeschlagenen Pipes abbrechen

history, !!

Frühere Befehle wiederverwenden

Linux · macOS#
history | !! | !$ | !N | !prefix | ^old^new
sudo !!

letzten Befehl mit sudo erneut ausführen

cd !$

das letzte Argument des vorherigen Befehls verwenden

!42

Zeile 42 des Verlaufs erneut ausführen

^foo^bar

letzten Befehl mit bar statt foo erneut ausführen

Mit HISTCONTROL=ignorespace (unter Ubuntu als Teil von ignoreboth Standard) wird ein Befehl mit führendem Leerzeichen nicht gespeichert: nützlich für Befehle mit Geheimnissen.

Ctrl+R, Ctrl+A …

Tastenkürzel im Terminal (bash/readline)

Linux · macOS#
Emacs-style readline keys (the default)
Ctrl+R
Verlauf rückwärts durchsuchen; erneut drücken für ältere Treffer
Ctrl+A / Ctrl+E
Zeilenanfang / Zeilenende
Ctrl+U / Ctrl+K
bis zum Zeilenanfang / Zeilenende ausschneiden
Ctrl+W
das vorherige Wort ausschneiden
Ctrl+Y
Ausgeschnittenes einfügen
Alt+B / Alt+F
ein Wort zurück / vor
Alt+.
das letzte Argument des vorherigen Befehls einfügen
Ctrl+L
Bildschirm leeren
Ctrl+C
laufenden Befehl abbrechen
Ctrl+D
Ende der Eingabe; beendet die Shell bei leerer Zeile
Tab Tab
Vervollständigungen anzeigen
bind -P | less

alle Tastenbelegungen auflisten

man / --help

Hilfe zu jedem Befehl bekommen

Linux · macOS#
man [section] cmd | cmd --help | help builtin | apropos word
man rsync

vollständiges Handbuch; / zum Suchen, q zum Beenden

man 5 crontab

Abschnitt 5: das Dateiformat, nicht der Befehl

help cd

bash-Builtins haben keine eigene Manpage

apropos partition

welche Befehle ein Wort erwähnen

#!/usr/bin/env bash

Shell-Skript schreiben und ausführen

Linux · macOS#
#!/usr/bin/env bash, chmod +x, ./script.sh
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
  echo "found $name.txt"
fi
for f in *.log; do
  echo "$f"
done

Argumente, ein Test, eine Schleife

chmod +x script.sh && ./script.sh Ada

ausführbar machen und starten

bash -x script.sh

jede Zeile beim Ausführen protokollieren

$1 … $9 sind Argumente, "$@" sind alle, $# ist ihre Anzahl. [[ ]] ist bash; in POSIX-sh-Skripten [ ] verwenden.

clear / reset

Verstümmeltes Terminal leeren oder reparieren

Linux · macOS#
clear | reset
reset

wenn cat auf eine Binärdatei das Terminal nur noch Zeichensalat ausgeben lässt

Eine statische Referenz, die in deinem Browser läuft; deine Suchanfragen werden nirgendwohin gesendet. Alle kostenlosen Tools ansehen.

Ein Problem gefunden oder etwas, das besser sein könnte? Wir lesen jede Nachricht und beheben Fehler schnell.

Dieser Linux-Spickzettel gruppiert mehr als 200 Befehle nach der Aufgabe, die du erledigen willst: Navigieren und Dateien verwalten, Rechte, Prozesse, Speicherplatz, Netzwerk, Pakete, Benutzer, Archive, Suchen, Textverarbeitung, systemd-Dienste und Logs, cron und die Bash-Grundlagen, die alles verbinden. Jeder Eintrag zeigt die Syntax, die Optionen, die du tatsächlich brauchst, mit einer einzeiligen Erklärung, kopierbare Beispiele und, wo es darauf ankommt, eine Warnung. Suche nach Aufgabe („free disk space“, „what is using port 8080“) oder nach Befehlsname und verlinke direkt auf jeden Eintrag.

Die Optionen folgen den Handbüchern von GNU coreutils, util-linux, procps-ng, iproute2, systemd und bash – also dem, was Ubuntu, Debian, Fedora, RHEL, Arch und openSUSE mitliefern. Wo sich macOS anders verhält, sagt ein blauer Hinweis wie, denn sed -i, date -d, stat -c und xargs sind die klassischen Stellen, an denen ein Skript, das auf dem einen System geschrieben wurde, auf dem anderen scheitert. Es ist eine Referenz für die gängigen 90 %, kein Ersatz für Manpages: Für selten genutzte Optionen bleibt man <command> maßgeblich.

So funktioniert’s

  1. Tippe eine Aufgabe oder einen Befehl ins Suchfeld (mit / springst du dorthin). Alle Wörter müssen passen, „tar extract“ grenzt also auf die tar-Einträge ein.
  2. Springe mit den Abschnitts-Chips zu einem Thema wie Netzwerk oder Pakete, oder setze das Häkchen bei „Nur gefährliche“, um jeden Befehl zu sehen, der Daten zerstören oder dich aussperren kann.
  3. Klicke neben einem Beispiel auf „Kopieren“ und ersetze dann die Beispiel-Dateinamen und -Hosts durch deine eigenen.
  4. Klicke auf das # neben einem Eintrag, um einen direkten Link dorthin zu erhalten, zum Beispiel /tools/linux-commands-cheat-sheet#rsync.
  5. Mit „Drucken / Als PDF speichern“ bekommst du eine kompakte zweispaltige Fassung ohne die Website-Navigation.

Häufige Fragen

Welche grundlegenden Linux-Befehle sollte man zuerst lernen?

Fang mit Navigation und Dateien an: pwd, ls, cd, mkdir, cp, mv, rm, cat und less. Dann man (Hilfe), sudo, grep und find zum Suchen, chmod und chown für Rechte, ps, top und kill für Prozesse, df und du für Speicherplatz sowie ssh und scp für entfernte Rechner. Lerne Pipes (|) und Umleitungen (> und >>) früh, denn mit ihnen kombinierst du alles andere.

Wie prüfe ich den Speicherplatz unter Linux?

Führe df -h aus, um den freien Platz auf jedem eingehängten Dateisystem in gut lesbaren Einheiten zu sehen. Um herauszufinden, was den Platz belegt, führe in einem Verzeichnis du -h -d 1 | sort -h aus: Es listet die Unterordner auf, die größten zuletzt. Meldet df eine volle Platte, du findet aber nichts, hält wahrscheinlich ein Prozess eine gelöschte Datei noch offen; sudo lsof +L1 listet solche Dateien auf.

Wie finde ich heraus, welcher Prozess einen Port belegt?

Führe sudo ss -tulpn aus, um jeden lauschenden TCP- und UDP-Port mit dem zugehörigen Programm aufzulisten, oder sudo lsof -i :8080 für einen einzelnen Port. Das sudo ist wichtig: Ohne siehst du nur die Namen deiner eigenen Prozesse. ss hat netstat abgelöst, das auf Systemen mit installiertem net-tools-Paket weiterhin funktioniert.

Was ist der Unterschied zwischen kill und kill -9?

kill PID sendet SIGTERM, das den Prozess bittet, sich zu beenden, und ihn aufräumen lässt: Dateien schreiben, Sperren freigeben, Verbindungen schließen. kill -9 PID sendet SIGKILL, das der Kernel sofort durchsetzt und das der Prozess weder abfangen noch ignorieren kann – aufgeräumt wird also nicht. Nimm zuerst ein einfaches kill, warte ein paar Sekunden und heb dir -9 für Prozesse auf, die es ignorieren.

Warum funktioniert sed -i auf dem Mac nicht?

macOS liefert BSD-sed mit, bei dem -i ein Argument für die Backup-Endung verlangt. Auf macOS schreibst du sed -i '' 's/old/new/g' file; unter Linux mit GNU-sed scheitert derselbe Befehl, weil '' als Skript gelesen wird. Die Form, die auf beiden funktioniert, ist sed -i.bak 's/old/new/g' file – sie behält eine Sicherungskopie, die du danach löschen kannst.

Sind diese Befehle auf jeder Linux-Distribution gleich?

Fast alle: Die Kernwerkzeuge stammen überall aus denselben GNU- und util-linux-Projekten. Unterschiedlich sind der Paketmanager (apt bei Debian und Ubuntu, dnf bei Fedora und RHEL, pacman bei Arch, zypper bei openSUSE, nebeneinander in der Pakettabelle), manche Pfade zu Logdateien, die Admin-Gruppe (sudo vs. wheel) und das Firewall-Frontend (ufw vs. firewalld). Alpine und BusyBox-basierte Systeme nutzen kleinere Versionen der Tools mit weniger Optionen.

Die Befehle, die ein System ruinieren können, und die Gewohnheit, die das verhindert

Eine kurze Liste von Befehlen richtet fast den gesamten Schaden an: rm -rf mit falschem oder leerem Pfad, dd oder mkfs auf der falschen Platte, chmod -R 777 oder chown -R auf einem Systemverzeichnis, rsync --delete oder Spiegelungen im robocopy-Stil mit vertauschter Quelle und Ziel, crontab -r statt crontab -e, usermod -G ohne -a und find mit -delete an der falschen Stelle. Jeder davon ist im Spickzettel als gefährlich markiert, samt der konkreten Art, wie es schiefgeht.

Die Gewohnheit, die das meiste verhindert: zuerst die harmlose Variante ausführen. Vor rm -rf führst du ls auf denselben Pfad aus. Vor find … -delete dasselbe find mit -print. Vor rsync --delete fügst du -n für einen Probelauf hinzu. Vor dd oder mkfs führst du lsblk aus und liest den Gerätenamen zweimal. Schreib in Skripten ${DIR:?} statt $DIR, damit eine leere Variable das Skript abbricht, statt einen Pfad in / zu verwandeln.

Zwei Shell-Einstellungen helfen ebenfalls: set -euo pipefail am Anfang eines Skripts stoppt beim ersten Fehler, statt mit kaputtem Zustand weiterzumachen, und set -o noclobber sorgt dafür, dass > eine vorhandene Datei nicht überschreibt.

GNU vs. macOS (BSD): wo sich derselbe Befehl anders verhält

macOS ist Unix, aber seine Kommandozeilen-Tools stammen von FreeBSD statt von GNU, und die Unterschiede zeigen sich genau dann, wenn du einen Befehl aus einem Linux-Tutorial kopierst:

• sed -i braucht auf macOS ein Argument (sed -i '' …); -i.bak funktioniert auf beiden.

• date hat auf macOS kein -d; nimm date -r <epoch>, um einen Zeitstempel umzuwandeln, und date -v-2d für relative Daten.

• stat verwendet -f mit anderen Formatbuchstaben statt GNU -c.

• xargs überspringt auf macOS standardmäßig leere Eingaben, während GNU-xargs den Befehl einmal ausführt, sofern nicht -r angegeben ist.

• du akzeptiert auf beiden -d 1, aber nur GNU kennt --max-depth; ps hat auf macOS kein --sort (nimm ps aux -m oder -r).

• head -n -5, tac, free, ip, ss, timeout und watch fehlen in einem Standard-macOS.

Wenn du auf einem Mac GNU-Verhalten brauchst, installieren die Homebrew-Pakete coreutils, gnu-sed und findutils die GNU-Versionen mit dem Präfix g (gsed, gdate, gstat, gxargs).

Rechte lesen und das richtige chmod wählen

ls -l zeigt Rechte als zehn Zeichen an, etwa -rwxr-x---. Das erste ist der Typ (- Datei, d Verzeichnis, l Link); die nächsten neun sind drei Gruppen aus Lesen, Schreiben und Ausführen für den Besitzer, die Gruppe und alle anderen. Als Zahlen ist r 4, w 2 und x 1, pro Gruppe addiert – rwxr-x--- ist also 750.

Typische Modi: 644 für normale Dateien, 755 für Verzeichnisse und Skripte, 600 für private Schlüssel und Dateien mit Geheimnissen, 700 für ein privates Verzeichnis wie ~/.ssh. Bei einem Verzeichnis bedeutet x „darf betreten werden“ – deshalb brauchen Verzeichnisse es und normale Dateien nicht. Der chmod-Rechner wandelt zwischen symbolischer und oktaler Schreibweise um, wenn du einen Modus vor dem Anwenden prüfen willst.

Ähnliche kostenlose Tools

  • CMD vs. PowerShell vs. Bash — Dieselbe Aufgabe in Eingabeaufforderung, PowerShell und Bash nebeneinander: Dateien, grep, Umgebungsvariablen, Prozesse, Netzwerk, Dienste und Skripting.
  • Chmod-Rechner — Setze Häkchen für Lesen, Schreiben und Ausführen und erhalte den Oktalmodus und den chmod-Befehl – oder entschlüssle 755, 644 und rwxr-xr-x.
  • Cron-Generator — Erstelle einen Cron-Zeitplan per Dropdown oder füge einen ein, lies ihn in Klartext und sieh die nächsten 10 Ausführungen in deiner Zeitzone und in UTC. Kostenlos, im Browser.
  • Subnetzrechner — Netzwerk-, Broadcast-Adresse, Hostbereich und Maske für jeden CIDR; Netze per VLSM aufteilen, IPv6 ausschreiben und überlappende Bereiche finden.
  • Git-Spickzettel — Git-Befehle geordnet nach dem, was du tun willst: letzten Commit rückgängig machen, Branch umbenennen, Remote-Branch löschen. Modernes switch/restore mit klassischen Entsprechungen und Warnhinweisen.