„Port belegt“ auf einem Server
Die erste Zeile der Rückwärtstabelle: ss -tulnp | grep :8080 findet die PID, dann kill <PID>, oder gleich kill -9 $(lsof -t -i :8080).
Guide
Die Linux-Befehlsübersicht ordnet die 160 Befehle, die im Terminal täglich getippt werden, in acht Gruppen: Dateien und Verzeichnisse, Inhalte ansehen und bearbeiten, Textverarbeitung, Rechte und Benutzer, Prozesse und Dienste, Netzwerk, Komprimieren und Packen sowie Systeminformationen und Verwaltung. Jeder Eintrag besteht aus einer Erklärung und ein paar direkt kopierbaren Beispielzeilen; Befehle mit vielen Optionen wie ls, find, grep, sed, awk, tar, curl, ss und journalctl bringen zusätzlich eine Tabelle der häufigsten Optionen zum Aufklappen mit.
Aktualisiert am 2026-09-094 sources8 min read
Die Linux-Befehlsübersicht ordnet die 160 Befehle, die im Terminal täglich getippt werden, in acht Gruppen: Dateien und Verzeichnisse, Inhalte ansehen und bearbeiten, Textverarbeitung, Rechte und Benutzer, Prozesse und Dienste, Netzwerk, Komprimieren und Packen sowie Systeminformationen und Verwaltung. Jeder Eintrag besteht aus einer Erklärung und ein paar direkt kopierbaren Beispielzeilen; Befehle mit vielen Optionen wie ls, find, grep, sed, awk, tar, curl, ss und journalctl bringen zusätzlich eine Tabelle der häufigsten Optionen zum Aufklappen mit.
Sie löst zwei Arten des Nachschlagens. Einmal kennst du den Befehlsnamen, hast aber die Argumente vergessen (Suche nach tar, chmod). Zum anderen weißt du nur, was du sehen willst – „welcher Prozess belegt 8080“, „welches Verzeichnis frisst den meisten Platz“, „warum ist dieser Dienst nicht gestartet“ – und dafür gibt es die Rückwärtstabelle „Ich möchte sehen… → welcher Befehl“: erst das Ziel, dann 2–3 Befehle, die dorthin führen, vom empfohlenen bis zum kompatiblen.
Unten auf der Seite läuft ein simuliertes Terminal im Browser: ein In-Memory-Dateisystem plus Shell-Interpreter für über 60 Befehle, mit Pipes, Umleitungen, Wildcards und einer gängigen Teilmenge von sed/awk, dazu 8 Übungslevel vom Anlegen einer Verzeichnisstruktur bis zum Auswerten von Logs per Pipe. Es greift nicht auf deinen Rechner zu und hat kein Netzwerk – ein vertipptes rm -rf setzt also nur das Level zurück.
help listet alle Befehle des Simulators, Tab vervollständigt Dateinamen.Die Suche nach „Port“ trifft Befehlstabelle und Rückwärtstabelle zugleich:
Eine vollständige Lösung von Level 8, „Pipe-Kombinationen“, im simulierten Terminal:
Ich möchte sehen: welcher Prozess belegt einen Port
ss -tulnp | grep :8080
lsof -i :8080
netstat -tulnp | grep 8080 ältere Systeme
Netzwerk › ss -tulnp lauschende Ports und zugehörige Prozesse (ersetzt netstat)
Netzwerk › lsof -i :<Port> welcher Prozess belegt einen Portuser@toolun-lab:~$ awk '{print $2}' access.log | sort | uniq -c | sort -rn
3 /index.html
2 /api/list
2 /about
✔ Geschafft: Pipe-Kombinationen: die meistbesuchten Pfade.Zwei Unix-Entwurfsprinzipien prägen diese Tabelle. „Alles ist eine Datei“: Geräte, Prozessinformationen (/proc) und Sockets werden als Dateien sichtbar, deshalb funktionieren seltsam anmutende Aufrufe wie cat /proc/cpuinfo, ls -l /dev/sd* oder echo > /dev/tcp/host/port. „Jedes Programm macht eine Sache und macht sie gut“: grep filtert nur, sort sortiert nur, uniq fasst nur benachbarte Duplikate zusammen, wc zählt nur – jedes für sich ist klein, die Kraft kommt aus der Verkettung per Pipe.
Deshalb taucht | in den Beispielen so oft auf: awk '{print $1}' access.log | sort | uniq -c | sort -rn | head baut aus fünf kleinen Programmen „die meistbesuchten IPs“. Die Ein- und Ausgabe jeder Stufe zu verstehen ist nützlicher, als den ganzen Befehl auswendig zu lernen.
Jeder Prozess startet mit drei geöffneten „Dateien“: Standardeingabe (0), Standardausgabe (1) und Standardfehler (2). > schreibt die Standardausgabe in eine Datei, 2> behandelt den Fehlerstrom, 2>&1 führt Fehler mit der Ausgabe zusammen, &> ist die bash-Kurzform. Die häufigste Alltagskombination ist cmd > out.log 2>&1 &: normale Ausgabe und Fehler landen im Log, danach geht es in den Hintergrund. Ein vergessenes 2>&1 ist der häufigste Grund für die Frage „warum steht kein Fehler im Log“.
Die erste Spalte von ls -l, etwa -rwxr-xr-x, besteht aus vier Teilen: Typ (- Datei, d Verzeichnis, l Link), dann Lesen (4), Schreiben (2) und Ausführen (1) für Eigentümer, Gruppe und alle anderen. Die drei Ziffern ergeben die Zahlenschreibweise: rwx=7, r-x=5, r--=4, also ist 755 „ich darf alles, alle anderen lesen und ausführen“ und 644 „ich darf lesen und schreiben, alle anderen nur lesen“. Bei Verzeichnissen bedeutet x „betreten“: Ohne x lässt sich ein Verzeichnis selbst mit r nicht auflisten. 600/700 gelten für private Schlüssel und ~/.ssh – SSH-Clients weisen Schlüsseldateien mit zu weiten Rechten zurück. Mehr Kombinationen lassen sich im chmod-Rechner zusammenklicken.
Der Name von kill täuscht: Er sendet einem Prozess nur ein Signal. Das Standard-TERM (15) heißt „bitte beenden“, der Prozess hat noch Gelegenheit zu speichern; KILL (9) beendet der Kernel sofort, ohne jede Chance – also erst kill, ein paar Sekunden warten und erst dann kill -9. HUP (1) ist bei Daemons die Konvention für „Konfiguration neu laden“; nginx -s reload nutzt sie im Hintergrund.
Moderne Distributionen verwalten Dienste mit systemd: systemctl startet, stoppt und aktiviert sie beim Booten, journalctl sammelt ihre Logs. Der feste Weg bei „Dienst startet nicht“ ist systemctl status für Zustand und die letzten Logzeilen → journalctl -u <Dienst> -n 100 für den vollständigen Fehler → ss -tlnp, um zu sehen, ob der Port schon belegt ist.
ifconfig, netstat, route und arp gehören zum nicht mehr gepflegten net-tools und werden auf neuen Systemen nicht mehr vorinstalliert; die Entsprechungen aus iproute2 sind ip addr, ss, ip route und ip neigh. Die Übersicht führt beide auf, die Rückwärtstabelle stellt die neuen Werkzeuge voran. Die fünf Buchstaben von ss -tulnp stehen für TCP, UDP, Lauschmodus, numerische Ports und Prozesse – fast immer der Standardauftakt bei einem Port-Problem.
GNU sed akzeptiert -i ohne Argument; BSD sed (das macOS mitbringt) verlangt nach -i ein Backup-Suffix, man schreibt also sed -i '' 's/a/b/' file. Ähnliche Unterschiede gibt es bei date -d (GNU) gegenüber date -v (BSD) und bei readlink -f, das auf älteren macOS-Versionen fehlt. Die Übersicht folgt den GNU-Versionen und vermerkt macOS-Abweichungen in den Hinweisen; brew install coreutils gnu-sed installiert die GNU-Fassungen.
yast), Desktop-Befehle und sprachspezifische CLIs fehlen.sed deckt nur s///, N,Mp und Nd ab, awk nur {print $N}; es gibt kein Netzwerk (curl, ssh, apt erklären, warum), keine echten Prozesse (ps, top, kill liefern feste Demodaten) und keine interaktiven Editoren (Dateien mit echo > oder cat >> schreiben).Die erste Zeile der Rückwärtstabelle: ss -tulnp | grep :8080 findet die PID, dann kill <PID>, oder gleich kill -9 $(lsof -t -i :8080).
Die Gruppe „Textverarbeitung“ ist ein komplettes Set: von grep -A3 -B1 für Kontext über awk/sort/uniq -c für Statistiken bis tail -F für rotierende Logs; die Übungslevel 3 und 8 behandeln genau diese zwei Aufgaben.
tar -czvf → scp / rsync -avz → tar -xzvf -C /var/www/, drei benachbarte Einträge; die Falle bei rsync --delete steht in den Hinweisen.
Die Gruppe „Systeminformationen und Verwaltung“ in der Reihenfolge cat /etc/os-release, nproc, free -h, df -h, ss -tlnp, systemctl list-units durchgehen – nach zehn Minuten steht ein Gesamtbild.
Grundsätzlich nicht. Linux hat keinen Papierkorb, rm gibt den Inode direkt frei. Vor wichtigen Verzeichnisoperationen den Pfad mit ls prüfen, in Skripten Variablen quoten und auf leer prüfen (rm -rf "${DIR:?}"/) oder rm durch ein Werkzeug wie trash-cli ersetzen.
Meist passt die Kodierung von Terminal oder Datei nicht. Zuerst mit file <Dateiname> die Kodierung ansehen, GBK-Dateien mit iconv -f GBK -t UTF-8 nach UTF-8 wandeln und erneut suchen; grep -a behandelt fälschlich als binär eingestufte Dateien als Text.
Die Spalten von ss -tulnp sind Netid, State, Recv-Q, Send-Q, Local Address:Port, Peer Address:Port und Process. Für den Port die Spalte Local Address:Port ansehen (*:8080 oder 0.0.0.0:8080 heißt alle Netzwerkkarten), für den Prozess die letzte Spalte, users:(("node",pid=842,fd=18)).
Es läuft im Browser, hat keinen Netzwerk-Stack und soll keine Anfragen in deinem Namen senden; diese Befehle geben eine Erklärung zurück und verweisen auf den passenden Eintrag in der Übersicht. Im Mittelpunkt der Level stehen Dateien, Text und Rechte – alles im In-Memory-Dateisystem voll nutzbar.
Das Lesen eigener Dateien braucht nichts; Systemverzeichnisse ändern (/etc, /usr), Ports unter 1024 belegen, Detailinformationen fremder Prozesse lesen sowie Dienste und Pakete verwalten brauchen root. sudo führt einen Befehl als root aus und ist sicherer, als dauerhaft zu root zu wechseln.
Übersichtsdaten, Rückwärtstabelle und Simulator sind statischer Inhalt, der mit der Seite ausgeliefert wird und lokal im Browser läuft; Suchen, Kopieren und Üben senden keine Anfragen. Favoriten liegen im localStorage des Browsers. Das Dateisystem des Simulators existiert nur im Speicher der aktuellen Seite, ist nach dem Aktualisieren leer und liest oder schreibt nie deine echten Dateien.
ls, cp, sort, cut und weiterer.ss(8), ip(8), find(1) und grep(1).Aktualisiert am 2026-09-09
160 Linux- und Shell-Befehle nach Dateien, Text, Rechten, Prozessen, Netzwerk, Archiven und System gruppiert, mit Optionstabellen und echten Beispielen sowie einer Rückwärtstabelle von Ziel zu Befehl; durchsuchbar, kopierbar, als Favorit speicherbar, mit Übungsterminal
Dieses Werkzeug ist noch nicht vollständig übersetzt; einige Inhalte nutzen die Ausgangssprache oder die Rückfallsprache.
Rückwärtssuche nach dem Ausgabeziel: Zuerst wird gesagt, was man wissen möchte, dann folgen 2–3 Befehle, die es liefern – vom neuesten zum ältesten und vom empfohlenen zum kompatiblen.
pwd # /var/www/site
ls -la # ausführliche + versteckte Dateien ls -lh # für Menschen lesbare Größe ls -lt | head # Zeigt das Neueste in umgekehrter Reihenfolge der Änderungszeit an
| -l | Langform: Berechtigungen, Eigentümer, Größe, Zeit |
| -a | Enthält versteckte Dateien, die mit beginnen. |
| -h | Größe in K/M/G |
| -t | Sortieren nach Änderungszeit |
| -S | Nach Größe sortieren |
| -R | Rekursives Unterverzeichnis |
| -d | Listen Sie nur das Verzeichnis selbst auf und geben Sie es nicht ein |
cd /var/log cd .. # Vorheriges Level cd - # Rückkehr zum vorherigen Verzeichnis cd # Home-Verzeichnis (dasselbe wie cd ~)
mkdir -p app/src/{components,utils}
mkdir -m 700 private| -p | Rekursiv erstellen, es wird kein Fehler gemeldet, wenn er bereits vorhanden ist |
| -m | Geben Sie Berechtigungen an |
| -v | Zeigen Sie, was geschaffen wurde |
touch README.md touch -d "2026-01-01" old.log # Geben Sie die Uhrzeit an
cp a.txt b.txt cp -r src/ backup/ # Verzeichnis erfordert -r cp -a /etc/nginx ~/nginx-bak # Berechtigungen und Zeit reservieren
| -r / -R | Verzeichnisse rekursiv kopieren |
| -a | Archiv: gleich -dR --preserve=all |
| -i | Fragen Sie vor der Berichterstattung nach |
| -n | Überschreiben Sie keine vorhandenen Dateien |
| -u | Nur kopieren, wenn die Quelle aktualisiert wird |
| -v | Prozess anzeigen |
mv old.txt new.txt # Umbenennen mv *.log logs/ # Batch-Verschiebung mv -i a.txt dir/ # Vor dem Überschreiben fragen
| -i | Fragen Sie vor der Berichterstattung nach |
| -n | Nicht abgedeckt |
| -f | Abdeckung erzwingen |
| -v | Prozess anzeigen |
rm file.txt rm -r build/ # Verzeichnis löschen rm -rf node_modules # Nichtexistenz nicht bestätigen oder ignorieren
rm gelangt nicht in den Papierkorb. Geben Sie vor rm -rf die Pfadvariable als Echo ein, um zu sehen, ob sie leer ist: rm -rf "$DIR"/ ist gleich rm -rf /, wenn DIR leer ist.
| -r | Verzeichnisse rekursiv löschen |
| -f | Fragen Sie nicht, ignorieren Sie, dass es nicht existiert |
| -i | Bestätigen Sie einzeln |
| -d | Leere Verzeichnisse löschen |
| -- | Die folgenden Parameter sind ungeeignete Optionen (Dateien löschen, die mit - beginnen) |
rmdir empty-dir rmdir -p a/b/c # zusammen mit dem leeren übergeordneten Verzeichnis
ln -s /opt/app/current ~/app ln -sf new-target link # Vorhandene Links überschreiben readlink -f link # Sehen Sie, wohin der Link zeigt
find . -name "*.log"
find /var -type f -size +100M # Dateien größer als 100 MB
finden . -mtime -7 -name "*.js" # Innerhalb von 7 Tagen geändert
find . -name "*.tmp" -delete
find . -type f -exec chmod 644 {} \;| -name / -iname | Nach Namen (-iname ignoriert Groß- und Kleinschreibung) |
| -type f|d|l | Datei/Verzeichnis/Link |
| -size +10M / -1k | nach Größe |
| -mtime -N / +N | Geändert innerhalb von N Tagen/N Tagen |
| -maxdepth N | Tiefe begrenzen |
| -exec cmd {} \; | Führen Sie den Befehl für jedes Ergebnis aus |
| -delete | Streichhölzer entfernen |
| -empty | Leere Datei oder Verzeichnis |
sudo updatedb locate nginx.conf
which python3 Geben Sie ls # Bash Built-in ein, Sie können Aliase / integrierte / externe Befehle sehen command -v node # Bestimmen Sie, ob der Befehl im Skript vorhanden ist
tree -L 2 tree -a -I "node_modules|.git" # ausschließen
file photo.bin # photo.bin: JPEG image data, ...
stat app.log stat -c "%s %n" * # Nur Größe und Name
du -sh . du -sh * | sort -rh | head # Wer nimmt den meisten Platz ein? du -h --max-depth=1 /var
| -s | Nur Gesamtsumme anzeigen |
| -h | für Menschen lesbar |
| --max-depth=N | Einschränkungsstufe |
| -a | Enthält Dateien |
df -h df -h /home df -i # Inode-Nutzung (voll, wenn zu viele Dateien vorhanden sind)
basename /var/log/syslog # syslog basename report.pdf .pdf # report dirname /var/log/syslog # /var/log
realpath ../config.yml
rsync -avz --progress src/ user@host:/srv/app/ rsync -av --delete ./dist/ /var/www/site/ # Löschen Sie auch redundante Dateien im Ziel rsync -avn src/ dst/ # -n Nur Vorschau
Das Vorhandensein oder Fehlen von / am Ende des Quellverzeichnisses hat unterschiedliche Bedeutungen: src/ synchronisiert den Inhalt und src synchronisiert das Verzeichnis selbst.
| -a | Archivmodus (rekursiv + Attribute beibehalten) |
| -v | Prozess anzeigen |
| -z | Übertragungskomprimierung |
| --delete | Löschen Sie überflüssige Dateien auf der Zielseite |
| -n / --dry-run | Nur Vorschau |
| --exclude=PAT | ausschließen |
| -P | Fortschritt + Fortsetzung vom Haltepunkt |
scp app.tar.gz user@1.2.3.4:/tmp/ scp -r user@host:/var/log/app ./logs scp -P 2222 file user@host:~ # Port angeben (Großbuchstabe P)
cat config.yml cat -n app.js # mit Zeilennummer cat a.txt b.txt > all.txt # Spleißen
| -n | Zeilennummer |
| -A | Unsichtbare Zeichen anzeigen (^M ist CRLF) |
| -s | Komprimieren Sie aufeinanderfolgende Leerzeilen |
less /var/log/syslog #/Stichwortsuche n nächstes G zum Ende g zum Anfang q Ende F folgen (wie tail -f)
| -N | Zeilennummer anzeigen |
| -S | Brechen Sie die Linie nicht |
| +F | Gehen Sie in den Folgemodus |
| -i | Bei der Suche wird die Groß-/Kleinschreibung ignoriert |
head -n 20 app.log head -c 100 file.bin # erste 100 Bytes head -n -5 Dateinummer außer den letzten 5 Zeilen
tail -n 50 app.log tail -f /var/log/nginx/access.log tail -F app.log # Folgen Sie weiter, nachdem die Datei gedreht wurde
| -n N | Nächste N Zeilen |
| -f | Folgen und hinzufügen |
| -F | Folgen Sie uns und kümmern Sie sich um die Dateirekonstruktion |
| -n +N | Von Zeile N bis zum Ende |
wc -l access.log ls | wc -l #Wie viele Elemente befinden sich im Verzeichnis? cat *.py | wc -l # Anzahl der Codezeilen
diff -u old.conf new.conf diff -r dir1 dir2 # Verzeichnisse vergleichen diff <(sort a) <(sort b) # Vergleichen Sie den sortierten Inhalt
| -u | einheitliches Format |
| -r | Vergleichen Sie Verzeichnisse rekursiv |
| -q | Bitte nur melden, wenn Abweichungen vorliegen |
| -w | Leerzeichen ignorieren |
| -i | Groß-/Kleinschreibung ignorieren |
cmp a.bin b.bin
nl -ba script.sh # Leere Zeilen werden ebenfalls nummeriert
tac app.log | less
strings app.bin | grep -i version
xxd file.bin | head -20 xxd -r dump.txt > file.bin # Wiederherstellen
nano /etc/hosts # Strg+O Speichern Strg+X Beenden Strg+W Suchen Strg+K Linie ausschneiden
vim app.conf # :wq Speichern und beenden :q! Beenden ohne zu speichern /Wortsuche dd Zeile löschen u rückgängig machen :Nu Zeilennummer festlegen
make 2>&1 | tee build.log echo »text« | sudo tee /etc/file # Verwenden Sie sudo, um geschützte Dateien zu schreiben cmd | tee -a log.txt # Anhängen
ls > list.txt echo "line" >> notes.txt cmd > out.log 2>&1 # Alles protokollieren cmd 2>/dev/null # Fehler verwerfen cmd &> all.log # Bash-Abkürzung
ps aux | grep nginx cat log | grep ERROR | wc -l history | tail -20
grep -rn "TODO" src/
grep -i error app.log
grep -v "^#" nginx.conf | grep -v "^$" # Kommentare und Leerzeilen entfernen
grep -E "5[0-9]{2}" access.log # Erweiterter regulärer Ausdruck
grep -l "main" *.c # Nur Dateinamen auflisten
grep -A3 -B1 "Exception" app.log # Erste 1 und letzte 3 Zeilen Kontext| -r / -R | rekursives Verzeichnis |
| -n | Zeilennummer anzeigen |
| -i | Groß-/Kleinschreibung ignorieren |
| -v | Auswahl umkehren (Zeilen ohne Muster) |
| -E | Erweiterter regulärer Ausdruck (wie egrep) |
| -F | als feste Zeichenfolge |
| -w | Ganzwortübereinstimmung |
| -c | Zählen Sie einfach die Anzahl der Zeilen |
| -l | Listen Sie nur übereinstimmende Dateinamen auf |
| -o | Geben Sie nur den passenden Teil aus |
| -A/-B/-C N | Nach/vor/vor und nach N Kontextzeilen |
| --include="*.js" | Begrenzen Sie Dateinamen bei der Rekursion |
rg "TODO" --type ts
rg -n "fetch\(" src/sed 's/foo/bar/g' a.txt # Das Ersetzungsergebnis ausgeben sed -i 's/foo/bar/g' a.txt # Dateien direkt ändern (GNU) sed -i.bak 's/8080/80/' app.conf # Erstellen Sie ein Backup, bevor Sie Änderungen vornehmen sed 's#/usr/local#/opt#g' f # Das Trennzeichen kann ersetzt werden
| -i | An Ort und Stelle ändern (macOS erfordert -i '') |
| -n | Gibt nur die Zeilen aus, die mit dem Befehl p ausgewählt wurden |
| -e | mehrere Skripte |
| -E | verlängert regelmäßig |
| g-Flagge | Ersetzen Sie alles in einer Zeile |
sed -n '10,20p' app.log # Zeilen 10–20 sed '5d' f.txt # Zeile 5 löschen sed '/^$/d' f.txt # Leere Zeilen löschen sed '3i\new line' f.txt # Vor Zeile 3 einfügen
awk '{print $1}' access.log | sortieren | uniq -c | sort -rn | head # Die am häufigsten besuchten IPs
awk -F: '{print $1}' /etc/passwd # Benutzername
awk '$3 > 100 {print $0}' data.txt # Die dritte Spalte ist größer als 100 Zeilen
awk '{sum += $2} END {print sum}' f # Summe| -F <Trennzeichen> | Feldtrennzeichen (standardmäßig leer) |
| $0 / $1 / $NF | Ganze Zeile / 1. Spalte / letzte Spalte |
| NR | Aktuelle Zeilennummer |
| BEGIN{} / END{} | Vor dem Start/nach dem Ende ausführen |
| /regulär/{…} | Verarbeiten Sie nur übereinstimmende Zeilen |
cut -d, -f1,3 data.csv cut -d: -f1 /etc/passwd Schneiden Sie die Dateinummer -c1-8 nach Zeichenposition aus
sort names.txt sort -n nums.txt # Nach numerischem Wert sort -k2 -t, -r data.csv # Sortiert nach Spalte 2 in umgekehrter Reihenfolge sort -u list.txt # Duplikate sortieren und entfernen sort -h size.txt # Nach K/M/G-Größe
| -n | nach Wert |
| -r | umgekehrte Reihenfolge |
| -k N | nach Spalte N |
| -t <Trennzeichen> | Spaltentrenner |
| -u | Duplikate entfernen |
| -h | menschenlesbare Größe |
| -V | Sortierung nach Versionsnummern (1.2 < 1.10) |
sort words.txt | uniq -c | sort -rn a.txt sortieren | uniq -d # Nur Duplikate anzeigen a.txt sortieren | uniq -u # Nur die eindeutigen anzeigen
echo hello | tr a-z A-Z # HELLO tr -d '\r' < win.txt > unix.txt # CR entfernen tr -s ' ' < f # Aufeinanderfolgende Leerzeichen komprimieren echo $PATH | tr ':' '\n' # Eine pro Zeile
find . -name "*.log" | xargs rm
finden . -name "*.txt" -print0 | xargs -0 wc -l # Der Dateiname enthält Leerzeichen
cat-URLs.txt | xargs -n1 -P4 curl -sO # 4-Wege-Parallel
echo a b c | xargs -I{} echo "item: {}"| -0 | NUL getrennt (mit find -print0) |
| -n N | Übergeben Sie jedes Mal N Parameter |
| -I {} | Verwenden Sie {}, um Platz zu belegen |
| -P N | N parallel |
| -r | Nicht ausführen, wenn die Eingabe leer ist |
paste -d, names.txt emails.txt
join -t, -1 1 -2 1 <(sort a.csv) <(sort b.csv)
cat /etc/fstab | column -t mount | column -t
echo abc | rev # cba
falten -w 80 -s long.txt # -s an Leerzeichen falten
iconv -f GBK -t UTF-8 gbk.txt > utf8.txt iconv -l | grep -i gb # Unterstützte Kodierungen auflisten
dos2unix script.sh sed -i "s/\r$//" script.sh # Wenn dos2unix nicht installiert ist
curl -s https://api.github.com/repos/git/git | jq .stargazers_count jq ".items[] | .name" data.json jq -r ".[].id" list.json # -r Originalzeichenfolge ohne Anführungszeichen cat a.json | jq. # Formatierung
echo "Hello" echo -e "a\tb\nc" echo $HOME echo "PATH=$PATH" >> ~/.bashrc
printf "%-10s %5d\n" name 42 printf "%.2f\n" 3.14159 printf "%s\n" *.txt # Ein Dateiname pro Zeile
seq 1 10 seq 0 5 100 # Schrittweite 5 for i in $(seq 1 3); do echo $i; done
echo "2^10" | bc echo "scale=3; 10/3" | bc echo »obase=16; 255« | bc # In Hexadezimal konvertieren
chmod 755 script.sh # rwxr-xr-x chmod 644 file.txt # rw-r--r-- chmod 600 ~/.ssh/id_ed25519 # Nur Sie können lesen und schreiben chmod -R 755 public/ # rekursiv
| 755 | Allgemeine Werte für Verzeichnis/ausführbare Datei |
| 644 | Gemeinsame Werte für gewöhnliche Dateien |
| 600 | Private Schlüssel- und Passwortdateien |
| 700 | Privates Verzeichnis (z. B. ~/.ssh) |
| -R | Rekursion |
chmod +x deploy.sh # Ausführbare Datei hinzufügen chmod u+w,go-w file # Der Besitzer kann schreiben, andere nicht chmod a-x file chmod g+s shared/ # Verzeichnis setgid: neue Dateivererbungsgruppe
sudo chown www-data:www-data -R /var/www/site sudo chown $USER file.txt chgrp-Entwicklerprojekt/ # nur mischen
umask umask 027 # Gruppe schreibgeschützt, andere haben keine Berechtigungen
sudo apt update sudo -i # Zur interaktiven Root-Shell wechseln sudo -u postgres psql # Als anderer Benutzer ausführen Sudo!! # Verwenden Sie sudo, um den vorherigen erneut auszuführen
su - deploy Exit # zurückkommen
whoami id id-Deploy # Andere Benutzer anzeigen
sudo useradd -m -s /bin/bash deploy sudo passwd deploy sudo usermod -aG sudo deploy # Sudo-Gruppe beitreten
sudo usermod -aG docker $USER newgrp docker # Oder melden Sie sich erneut an, um wirksam zu werden
sudo userdel -r olduser
passwd sudo passwd deploy sudo passwd -l deploy # Konto sperren
groups groups www-data cat /etc/group | grep docker
who w last -n 10 lastlog
ssh-keygen -t ed25519 -C "me@example.com" cat ~/.ssh/id_ed25519.pub ssh-copy-id user@host # Installieren Sie den öffentlichen Schlüssel auf dem Server
ssh user@1.2.3.4 ssh -p 2222 user@host #Port angeben ssh -i ~/.ssh/key.pem ubuntu@host ssh -L 8080:localhost:80 user@host # Portweiterleitung ssh user@host »uptime« # Nur einen Befehl ausführen
| -p | Hafen |
| -i | private Schlüsseldatei |
| -L lokal:Ziel:Port | lokale Portweiterleitung |
| -N | Nur die Weiterleitung öffnet die Shell nicht |
| -v | Debuggen von Verbindungsproblemen |
Host prod
HostName 1.2.3.4
User deploy
Port 2222
IdentityFile ~/.ssh/prod_keyps aux | grep nginx ps -ef | grep java ps aux --sort=-%mem | head # Der speicherintensivste ps -p 1234 -o pid,etime,cmd # Wie lange läuft ein Prozess schon?
| aux | BSD-Stil: alle Benutzer, einschließlich Terminals, ausführlich |
| -ef | UNIX-Stil: alle Prozesse einschließlich des übergeordneten Prozesses |
| --sort=-%cpu | In umgekehrter Reihenfolge nach CPU sortieren |
| -p PID | Prozess angeben |
| -o-Feld | Benutzerdefinierte Spalten |
pgrep -f "node server.js" pgrep -l nginx # mit Namen pkill -f "node server.js" # Suchen und töten
top top -o %MEM top -p 1234 # Nur einen bestimmten Prozess anzeigen
htop htop -u www-data
kill 1234 kill -9 1234 # Töte, wenn du ungehorsam bist kill -HUP 1234 # Lassen Sie den Dienst die Konfiguration neu laden kill -l # Signalliste
| -15 / -TERM | Standard: Normales Beenden anfordern |
| -9 / -KILL | Erzwungenes Ende, ohne eine Chance zum Aufräumen zu geben |
| -1 / -HUP | Wird häufig zum Überladen der Konfiguration verwendet |
| -2 / -INT | Entspricht Strg+C |
| -STOP / -CONT | Pause / Fortsetzen |
killall node killall -9 chrome
npm run build & jobs fg %1 # Strg+Z pausiert die aktuelle Vordergrundaufgabe, dann bg, um sie im Hintergrund fortzusetzen
nohup python server.py > server.log 2>&1 & echo $! # PID wurde gerade gestartet
tmux new -s work # Strg+B, dann d zum Trennen tmux ls tmux attach -t work tmux kill-session -t work
systemctl status nginx systemctl status --failed # Dienst fehlgeschlagen
sudo systemctl restart nginx sudo systemctl reload nginx # Konfiguration neu laden, ohne die Verbindung zu unterbrechen
sudo systemctl enable --now docker sudo systemctl disable apache2 systemctl is-enabled nginx
systemctl list-units --type=service --state=running systemctl list-unit-files | grep enabled
journalctl -u nginx -f journalctl -u app -n 200 --no-pager journalctl --since "1 hour ago" journalctl -p err -b # Fehler seit diesem Start sudo journalctl --vacuum-size=500M # Bereinigen
| -u <Einheit> | eine Dienstleistung |
| -f | folgen |
| -n N | Letzte N Zeilen |
| --since / --until | Zeitbereich |
| -p err | Nach Ebene filtern |
| -b | Dieses Startup |
| -k | Kernel-Nachrichten |
crontab -e # Backup jeden Tag um 15:30 Uhr 30 3 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 # alle 5 Minuten */5 * * * * /usr/bin/curl -s https://example.com/ping crontab -l # Anzeigen
echo "systemctl restart app" | at 03:00 atq #Warteschlange atrm 3 # löschen
watch -n 2 "df -h" watch -d free -m # -d Änderungen hervorheben
time ./build.sh time curl -s https://example.com > /dev/null
timeout 10 ping example.com timeout -s KILL 30 ./stuck.sh
lsof -p 1234 lsof +D /var/log # Wer verwendet die Dateien in diesem Verzeichnis? lsof | grep gelöscht # Gelöschte, aber belegte Dateien (die Festplatte wird nicht freigegeben)
strace -p 1234 strace -f -e trace=network node app.js strace -c ./cmd # Statistik
nice -n 19 tar czf big.tgz data/ renice -n 10 -p 1234
ss -tulnp ss -tlnp | grep :80 ss -s # Verbindungsstatistik ss -tan state established
| -t / -u | TCP / UDP |
| -l | Nur überwachen |
| -n | Der numerische Port löst den Dienstnamen nicht auf |
| -p | Prozesse anzeigen (erfordert Root, um alle zu sehen) |
| -a | Alle verbinden |
netstat -tulnp | grep 3000 netstat -an | grep ESTABLISHED | wc -l
lsof -i :8080 lsof -i tcp -sTCP:LISTEN kill -9 $(lsof -t -i :3000) # Töte den Besatzer direkt
ip addr ip -4 -br addr # streamline Hostname -I # Nur IP
ip route ip route get 8.8.8.8 # Welchen Weg führt man zu einer bestimmten Adresse?
ping -c 4 example.com ping -i 0.2 -c 20 10.0.0.1
traceroute example.com mtr -rw example.com
curl -I https://example.com # Nur Antwortheader lesen
curl -sS https://api.example.com/x | jq. # Still, aber es wird ein Fehler gemeldet
curl -o file.zip -L https://…/file.zip # Laden Sie die Weiterleitungen herunter und folgen Sie ihnen
curl -X POST -H "Content-Type: application/json" -d '{"a":1}' https://api.example.com/items
curl -u user:pass https://…
curl -w "%{http_code} %{time_total}\n" -o /dev/null -s https://example.com| -I | Nur Header anfordern (HEAD) |
| -L | Folgen Sie der Weiterleitung |
| -o Datei / -O | In Datei speichern / Remote-Dateinamen verwenden |
| -X-Methode | Anfragemethode |
| -H »Header:Wert« | Anforderungsheader |
| -d Daten | Anforderungstext (Standard-POST) |
| -s / -S | Still/Ruhe mit Fehlern |
| -v | Vollständige Interaktion anzeigen |
| -k | Zertifikatfehler ignorieren (zum Debuggen) |
| -w-Format | Ausgabestatuscode, Zeitverbrauch usw. |
wget https://example.com/file.tar.gz wget -c https://…/big.iso # Download fortsetzen wget -qO- https://example.com | head # Ausgabe auf dem Bildschirm wget -r -np -nH --cut-dirs=1 https://example.com/docs/
dig example.com dig +short example.com dig MX example.com dig @8.8.8.8 example.com # DNS angeben dig -x 93.184.216.34 # Rückwärtsprüfung
nslookup example.com nslookup -type=txt example.com
host example.com
sudo nano /etc/hosts 127.0.0.1 dev.example.com
nc -zv example.com 443 nc -l 8080 # Überwachen Sie 8080 Echo »Hallo« | NC-Host 8080 # Daten senden
telnet smtp.example.com 25
sudo ufw status sudo ufw allow 22 sudo ufw allow 80/tcp sudo ufw allow from 10.0.0.0/8 to any port 5432 sudo ufw enable
Stellen Sie sicher, dass Sie 22 freigeben, bevor Sie es öffnen, da sonst SSH von selbst gesperrt wird.
sudo firewall-cmd --list-all sudo firewall-cmd --add-port=8080/tcp --permanent sudo firewall-cmd --reload
sudo iptables -L -n -v --line-numbers sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo tcpdump -i eth0 port 80 -nn sudo tcpdump -i any host 10.0.0.5 -w cap.pcap # Speichern Sie die Datei in Wireshark
sudo iftop -i eth0 nload
ip neigh arp -a
tar -czvf site.tar.gz site/ tar -czf logs.tgz --exclude="*.tmp" logs/ tar -cJvf site.tar.xz site/ # xz komprimiert kleiner und langsamer
| -c | erstellen |
| -x | Lösen |
| -t | Inhalt auflisten |
| -z / -j / -J | gzip / bzip2 / xz |
| -v | Datei anzeigen |
| -f-Datei | Name der Archivdatei (muss dem Dateinamen folgen) |
| -C-Verzeichnis | Wechseln Sie in das Verzeichnis und bedienen Sie es |
| --exclude=PAT | ausschließen |
tar -xzvf site.tar.gz tar -xzvf site.tar.gz -C /var/www/ tar -xf any.tar.* # Neue Version von tar erkennt automatisch das Komprimierungsformat tar -tzvf site.tar.gz # Schauen wir uns zuerst an, was drin ist
gzip big.log # big.log.gz abrufen gzip -k big.log # Behalten Sie die Originaldatei gunzip big.log.gz zcat big.log.gz | grep ERROR # Direkt anzeigen, ohne zu dekomprimieren
zip -r project.zip project/ -x "*/node_modules/*" zip -e Secret.zip file.txt # Verschlüsselung
unzip archive.zip unzip archive.zip -d out/ unzip -l archive.zip # Nur die Liste anzeigen unzip -O gbk cn.zip # Wenn chinesische Windows-Dateinamen verstümmelt sind
7z x archive.7z 7z a -mx9 out.7z dir/ 7z x file.rar
xz -9 big.sql xz -d big.sql.xz bzip2 -k file
split -b 100M big.iso part_ cat part_* > big.iso
sha256sum ubuntu.iso sha256sum -c SHA256SUMS md5sum file.zip
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress && sync dd if=/dev/zero of=test.bin bs=1M count=100 # 100 MB Testdatei
of= Wenn Sie das falsche Gerät schreiben, wird die Festplatte direkt gelöscht. Bitte bestätigen Sie vor der Ausführung dreimal mit lsblk.
uname -a uname -m # x86_64 / aarch64 cat /etc/os-release # Release-Version
hostnamectl sudo hostnamectl set-hostname web-01
uptime # Laden > Anzahl der CPU-Kerne (nproc) zeigt die Warteschlange an
free -h free -m -s 2 # Alle 2 Sekunden aktualisieren
nproc lscpu | grep -E "Model name|^CPU\(s\)"
lsblk lsblk -f # Mit Dateisystem und UUID sudo fdisk -l
sudo mount /dev/sdb1 /mnt/usb sudo umount /mnt/usb montieren | Spalte -t # Gemountet cat /etc/fstab # Beim Booten automatisch mounten
vmstat 1 10
iostat -x 1 5
sudo dmesg -T | tail -50 sudo dmesg -T | grep -i "Prozess getötet" # Wer wurde OOMed?
env | sort printenv HOME echo $PATH | tr ":" "\n"
export JAVA_HOME=/usr/lib/jvm/java-17 export PATH="$HOME/.local/bin:$PATH" echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc
alias ll="ls -alF" alias gs="git status" unalias ll Alias # Liste
history | grep ssh !105 sudo !! History -c # Löschen
sudo apt update && sudo apt upgrade sudo apt install htop apt search nginx apt show nginx sudo apt remove --purge pkg && sudo apt autoremove
| update | Aktualisieren Sie den Softwarequellenindex |
| upgrade | Installiertes Paket aktualisieren |
| install / remove | Installieren/deinstallieren |
| search / show | Suche / Details |
| autoremove | Bereinigen Sie nicht mehr benötigte Abhängigkeiten |
| list --installed | Installierte Liste |
sudo dnf install -y git sudo dnf update dnf search nginx sudo yum install epel-release # Altes System
sudo pacman -Syu sudo pacman -S neovim pacman -Ss keyword sudo pacman -Rns pkg
brew install jq brew upgrade brew list brew search ripgrep
sudo snap install code --classic snap list
sudo dpkg -i app.deb sudo apt -f install dpkg -l | grep nginx dpkg -L nginx #Welche Dateien werden gepackt?
sudo shutdown -h now sudo reboot sudo Shutdown -r +10 »Wartung nach 10 Minuten neu starten« sudo Shutdown -c # Abbrechen
date date "+%Y-%m-%d %H:%M:%S" date -d "yesterday" +%F Datum +%s # Zeitstempel date -d @1700000000 # Zeitstempel in Datum konvertieren
timedatectl sudo timedatectl set-timezone Asia/Shanghai timedatectl list-timezones | grep Asia
cal cal 2026 cal -3 # einen Monat vorher und nachher
lsmod | grep nvidia sudo modprobe br_netfilter
lspci | grep -i vga lsusb
ulimit -n ulimit -n 65535 # Aktuelle Sitzung cat /proc/sys/fs/file-max
chsh -s $(which zsh) echo $SHELL
source ~/.bashrc . ~/.zshrc # Synonym
#!/usr/bin/env bash set -euo pipefail # Stopp bei Fehler, undefinierter Variablenfehler, Pipe-Fehlerübertragung for f in *.log; do echo »Prozess $f« done
man tar man 5 crontab # Abschnitt 5: Dateiformat tar --help | less tldr tar # Community-Beispielversion (Installation erforderlich)
Ein kleines Dateisystem und ein Shell-Interpreter im Arbeitsspeicher: unterstützt ls / cd / cat / grep / sed / awk / find / chmod / tar und über 60 weitere Befehle, inklusive Pipes, Umleitungen und Wildcards; 8 Stufen führen von "Verzeichnisbaum anlegen" bis "Statistik per Pipe". Kein Netzwerk, kein Zugriff auf die echten Dateien. Die Git-Übung gibt es inGit-Befehlsübersicht.