Bash-Befehlssammlung für Linux-Server

Die wichtigsten Linux-Befehle für Server-Administration – Systeminfo, Dateien und Rechte, Benutzer, Pakete, systemd, Logs mit journalctl, Netzwerk, DNS, Firewall, SSH, Datenträger, Webserver, Backups und Fehlersuche.

Bash-Befehlssammlung für Linux-Server

Die Befehle, die auf Linux-Servern immer wieder gebraucht werden – mit Schwerpunkt auf Debian/Ubuntu. Wo sich RHEL-basierte Systeme (Rocky, Alma, Fedora) unterscheiden, steht es dabei.

Schnellübersicht

Thema Erste Befehle
System hostnamectl, uptime, free -h, lsblk
Dateien und Navigation ls -la, find, grep -r, tail -f
Rechte und Besitz chmod, chown, stat
Benutzer und sudo id, useradd, usermod -aG
Pakete apt update, apt upgrade, dnf
Dienste mit systemd systemctl status, restart, enable
Logs journalctl -u, journalctl -f
Prozesse und Last top, htop, ps aux, kill
Netzwerk ip a, ip r, ss -tulpn, ping, curl
DNS dig, resolvectl status
Firewall ufw status, nft list ruleset
SSH ssh-keygen, ssh-copy-id, sshd -t
Datenträger df -h, du -sh, ncdu, smartctl
Webserver und Zertifikate apachectl configtest, nginx -t, openssl
Archive, Kopie, Backup tar, rsync, scp
Zeitpläne crontab -e, systemctl list-timers
Docker docker ps, docker logs, docker compose
Bash-Helfer Pipes, Umleitungen, Verlauf, Tastenkürzel

1. System

Befehl Zweck
hostnamectl Hostname, Betriebssystem, Kernel, Virtualisierung
cat /etc/os-release Distribution und Version
uname -r Kernel-Version
uptime Laufzeit und Load-Average (1/5/15 Minuten)
free -h Arbeitsspeicher und Swap
nproc · lscpu Anzahl CPU-Kerne · CPU-Details
lsblk Datenträger und Partitionen als Baum
lspci · lsusb PCI- und USB-Geräte
dmidecode -t system 🔒 Hersteller, Modell, Seriennummer
timedatectl Uhrzeit, Zeitzone, NTP-Synchronisierung
last -n 10 letzte Anmeldungen
who · w wer ist gerade angemeldet (und was läuft)?
systemctl reboot 🔒 neu starten
[ -f /var/run/reboot-required ] && cat /var/run/reboot-required braucht der Server einen Neustart? (Debian/Ubuntu)

Kurzer Server-Steckbrief:

bash
echo "Host:    $(hostname -f)"
echo "System:  $(. /etc/os-release; echo "$PRETTY_NAME")"
echo "Kernel:  $(uname -r)"
echo "Laufzeit:$(uptime -p)"
echo "Last:    $(cut -d' ' -f1-3 /proc/loadavg)"
free -h | awk '/^Mem/ {print "RAM:     " $3 " von " $2 " belegt"}'
df -h / | awk 'NR==2 {print "Root-FS: " $3 " von " $2 " belegt (" $5 ")"}'
ip -4 -br addr show scope global

2. Dateien und Navigation

Befehl Zweck
pwd aktuelles Verzeichnis
cd - zurück ins vorherige Verzeichnis
ls -lah Inhalt mit versteckten Dateien, Rechten und lesbaren Größen
ls -lt | head zuletzt geänderte Dateien zuerst
tree -L 2 Verzeichnisbaum, zwei Ebenen tief (Paket tree)
cp -a quelle ziel kopieren mit Rechten und Zeitstempeln
mv alt neu verschieben oder umbenennen
rm -i datei löschen mit Rückfrage
mkdir -p a/b/c Verzeichnisse samt Zwischenebenen anlegen
less datei Datei seitenweise lesen (/ sucht, q beendet)
head -n 50 datei · tail -n 50 datei Anfang · Ende einer Datei
tail -f /var/log/syslog Datei live mitlesen
nano datei · vim datei Datei bearbeiten
diff -u alt neu Unterschiede zweier Dateien
ln -s ziel link symbolischen Link anlegen

Suchen:

Befehl Zweck
find /etc -name "*.conf" Dateien nach Namen
find /var/log -mtime -1 in den letzten 24 Stunden geändert
find / -xdev -size +500M 2>/dev/null große Dateien auf dem Root-Dateisystem
grep -rn "ServerName" /etc/apache2/ Text in Dateien suchen, mit Zeilennummer
grep -v "^#" datei | grep -v "^$" Konfiguration ohne Kommentare und Leerzeilen
grep -i fehler datei ohne Groß-/Kleinschreibung
which <befehl> · type <befehl> wo liegt ein Programm?

3. Rechte und Besitz

Befehl Zweck
ls -l datei Rechte, Besitzer, Gruppe
stat datei alle Metadaten inkl. Rechte als Zahl
chmod 640 datei Rechte als Zahl setzen (Besitzer rw, Gruppe r, Rest nichts)
chmod u+x skript.sh Besitzer darf ausführen
chmod -R g+rX ordner Gruppe darf lesen, Ordner betreten (großes X nur für Ordner)
chown user:gruppe datei 🔒 Besitzer und Gruppe ändern
chown -R www-data:www-data /var/www/site 🔒 rekursiv, z. B. für Webinhalte
namei -l /pfad/zur/datei Rechte entlang des gesamten Pfades – findet das Verzeichnis, an dem der Zugriff scheitert
getfacl datei · setfacl -m u:name:r datei erweiterte Rechte (ACL)
Zahl Bedeutung Typisch für
600 nur Besitzer lesen/schreiben private Schlüssel, Passwortdateien
640 Besitzer rw, Gruppe r Konfiguration mit Geheimnissen
644 alle lesen, Besitzer schreibt normale Dateien
750 Besitzer alles, Gruppe lesen/betreten Programm- und Datenverzeichnisse
755 alle lesen/betreten, Besitzer schreibt öffentliche Verzeichnisse, Programme

4. Benutzer und sudo

Befehl Zweck
whoami · id aktueller Benutzer · UID, GID und Gruppen
id <name> Gruppen eines anderen Benutzers
getent passwd <name> Kontoeintrag (auch aus LDAP/AD)
adduser <name> 🔒 Benutzer interaktiv anlegen (Debian/Ubuntu)
useradd -m -s /bin/bash <name> 🔒 Benutzer anlegen (alle Distributionen)
passwd <name> 🔒 Passwort setzen
usermod -aG sudo <name> 🔒 zur sudo-Gruppe hinzufügen (RHEL: Gruppe wheel)
usermod -L <name> · usermod -U <name> 🔒 Konto sperren · entsperren
chage -l <name> Passwortablauf anzeigen
userdel -r <name> 🔒 Benutzer samt Home-Verzeichnis löschen
sudo -i Root-Shell
sudo -u <name> <befehl> Befehl als anderer Benutzer ausführen
sudo -l was darf ich per sudo?
visudo 🔒 sudo-Regeln sicher bearbeiten (mit Syntaxprüfung)

5. Pakete und Updates

Debian/Ubuntu (apt):

Befehl Zweck
apt update 🔒 Paketlisten aktualisieren
apt list --upgradable verfügbare Updates
apt upgrade 🔒 Updates installieren
apt full-upgrade 🔒 Updates inkl. Abhängigkeitswechsel (neue Kernel o. Ä.)
apt install <paket> 🔒 Paket installieren
apt remove <paket> · apt purge <paket> 🔒 entfernen · samt Konfiguration entfernen
apt autoremove 🔒 nicht mehr benötigte Abhängigkeiten entfernen
apt search <begriff> · apt show <paket> suchen · Details
dpkg -l | grep <name> ist ein Paket installiert?
dpkg -S /pfad/datei zu welchem Paket gehört eine Datei?
apt-mark hold <paket> 🔒 Paket von Updates ausnehmen
dpkg-reconfigure -plow unattended-upgrades 🔒 automatische Sicherheitsupdates einrichten

RHEL, Rocky, Alma, Fedora (dnf):

Befehl Zweck
dnf check-update verfügbare Updates
dnf upgrade 🔒 Updates installieren
dnf install <paket> · dnf remove <paket> 🔒 installieren · entfernen
rpm -qa | grep <name> installierte Pakete
rpm -qf /pfad/datei zu welchem Paket gehört eine Datei?

6. Dienste mit systemd

Befehl Zweck
systemctl status <dienst> Status, letzte Logzeilen, Hauptprozess
systemctl start · stop · restart <dienst> 🔒 starten · stoppen · neu starten
systemctl reload <dienst> 🔒 Konfiguration neu laden ohne Unterbrechung (wenn unterstützt)
systemctl enable --now <dienst> 🔒 beim Booten starten und sofort starten
systemctl disable <dienst> 🔒 nicht mehr automatisch starten
systemctl is-active <dienst> · is-enabled <dienst> kurze Ja/Nein-Antwort, gut für Skripte
systemctl --failed alle fehlgeschlagenen Units
systemctl list-units --type=service --state=running laufende Dienste
systemctl cat <dienst> Unit-Datei samt Ergänzungen anzeigen
systemctl edit <dienst> 🔒 Ergänzung (Drop-in) anlegen statt Original zu ändern
systemctl daemon-reload 🔒 nach Änderungen an Unit-Dateien
systemd-analyze blame was hat beim Booten wie lange gedauert?

7. Logs mit journalctl

Befehl Zweck
journalctl -u <dienst> Logs eines Dienstes
journalctl -u <dienst> -f live mitlesen
journalctl -u <dienst> --since "1 hour ago" nur die letzte Stunde
journalctl -u <dienst> -n 100 --no-pager die letzten 100 Zeilen, ohne Blättern
journalctl -p err -b alle Fehler seit dem letzten Start
journalctl -b -1 Logs des vorherigen Starts – nach einem Absturz
journalctl --list-boots alle gespeicherten Starts
journalctl -k Kernel-Meldungen (wie dmesg)
journalctl --disk-usage Platzbedarf des Journals
journalctl --vacuum-time=14d 🔒 Journal auf 14 Tage kürzen
dmesg -T | tail -50 🔒 Kernel-Meldungen mit lesbarer Uhrzeit

Klassische Logdateien unter /var/log:

Datei Inhalt
/var/log/syslog · /var/log/messages allgemeines Systemlog (Debian · RHEL)
/var/log/auth.log · /var/log/secure Anmeldungen, sudo, SSH (Debian · RHEL)
/var/log/apache2/error.log Apache-Fehler (RHEL: /var/log/httpd/)
/var/log/nginx/error.log nginx-Fehler
/var/log/apt/history.log was wurde wann installiert?

Fehlgeschlagene SSH-Anmeldungen zählen:

bash
journalctl -u ssh --since today | grep -i "failed password" |
  grep -oE 'from [0-9.]+' | sort | uniq -c | sort -rn | head

8. Prozesse und Last

Befehl Zweck
top Live-Übersicht (M sortiert nach RAM, P nach CPU, q beendet)
htop komfortablere Variante (Paket htop)
ps aux --sort=-%mem | head Top-Prozesse nach Arbeitsspeicher
ps aux --sort=-%cpu | head Top-Prozesse nach CPU
pgrep -a <name> Prozesse nach Namen finden
kill <pid> Prozess höflich beenden (SIGTERM)
kill -9 <pid> Prozess hart beenden – nur wenn kill nicht reicht
pkill <name> Prozesse nach Namen beenden
lsof -p <pid> geöffnete Dateien eines Prozesses
lsof +L1 gelöschte, aber noch geöffnete Dateien – erklärt „Platte voll, aber du findet nichts“
vmstat 1 5 CPU, RAM, Swap, I/O im Sekundentakt
iostat -x 1 Auslastung der Datenträger (Paket sysstat)

9. Netzwerk

Befehl Zweck
ip -br a Adressen aller Schnittstellen, kurz
ip a Adressen mit allen Details
ip r Routingtabelle, Standard-Gateway
ip -br link Schnittstellen mit Status und MAC
ip neigh ARP-Tabelle
ss -tulpn 🔒 welche Ports lauschen, mit Prozess
ss -tnp state established aktive TCP-Verbindungen
ping -c 4 1.1.1.1 Verbindung testen
traceroute 1.1.1.1 · mtr 1.1.1.1 Weg der Pakete · mit Paketverlust je Hop
curl -I https://example.com HTTP-Kopfzeilen
curl -v https://example.com -o /dev/null Verbindungsaufbau samt TLS im Detail
nc -zv <host> 443 ist ein TCP-Port erreichbar?
wget <url> Datei herunterladen
nmcli · netplan get Netzwerkkonfiguration (NetworkManager · Ubuntu-Server)

Wo ist die Netzwerkkonfiguration?

System Ort
Ubuntu Server /etc/netplan/*.yaml, anwenden mit netplan try (rollt nach 120 s ohne Bestätigung zurück)
Debian /etc/network/interfaces, neu laden mit systemctl restart networking
RHEL/Rocky/Alma NetworkManager: nmcli con show, nmcli con mod …

10. DNS

Befehl Zweck
dig example.com A-Record mit Details (Paket dnsutils bzw. bind-utils)
dig +short example.com nur die Antwort
dig example.com MX · TXT · AAAA bestimmte Record-Typen
dig @1.1.1.1 example.com gezielt einen DNS-Server fragen
dig -x 203.0.113.10 Rückwärtsauflösung (PTR)
dig +trace example.com Auflösung ab den Root-Servern verfolgen
resolvectl status verwendete DNS-Server (systemd-resolved)
resolvectl flush-caches 🔒 DNS-Cache leeren
cat /etc/resolv.conf eingetragene Resolver
getent hosts example.com Auflösung so, wie Programme sie sehen (inkl. /etc/hosts)

11. Firewall

ufw (Ubuntu, einfach):

Befehl Zweck
ufw status verbose 🔒 Status und Regeln
ufw status numbered 🔒 Regeln mit Nummer
ufw allow OpenSSH 🔒 SSH erlauben – vor dem Einschalten!
ufw allow from 10.0.0.0/24 to any port 22 proto tcp 🔒 SSH nur aus dem eigenen Netz
ufw allow 443/tcp 🔒 HTTPS erlauben
ufw delete <nummer> 🔒 Regel löschen
ufw enable 🔒 Firewall einschalten

nftables / firewalld:

Befehl Zweck
nft list ruleset 🔒 alle nftables-Regeln
iptables -L -n -v 🔒 Regeln in iptables-Ansicht (ältere Systeme)
firewall-cmd --list-all 🔒 aktive Zone und Regeln (RHEL)
firewall-cmd --add-service=https --permanent && firewall-cmd --reload 🔒 Dienst dauerhaft freigeben (RHEL)

12. SSH

Befehl Zweck
ssh user@host verbinden
ssh -p 2222 user@host anderer Port
ssh-keygen -t ed25519 -C "dennis@laptop" Schlüsselpaar erzeugen
ssh-copy-id user@host öffentlichen Schlüssel auf den Server übertragen
ssh -L 8080:127.0.0.1:80 user@host lokale Portweiterleitung (Tunnel)
ssh -J sprung@bastion user@ziel über einen Sprungserver verbinden
sshd -t 🔒 SSH-Server-Konfiguration prüfen
systemctl reload ssh 🔒 Konfiguration übernehmen, bestehende Sitzungen bleiben
ssh-keygen -R host alten Host-Schlüssel nach Neuinstallation entfernen

Eintrag in ~/.ssh/config – kürzere Befehle:

text
Host wiki
    HostName 10.0.0.51
    User dennis
    IdentityFile ~/.ssh/id_ed25519

Danach reicht ssh wiki.

Sinnvolle Härtung in /etc/ssh/sshd_config.d/10-haertung.conf 🔒:

text
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no

13. Datenträger und Speicher

Befehl Zweck
df -h belegter und freier Platz je Dateisystem
df -i freie Inodes – „Platte voll“ trotz freien Speichers
du -sh /var/log Größe eines Verzeichnisses
du -h --max-depth=1 /var | sort -h Unterordner nach Größe sortiert
ncdu / interaktiv aufräumen (Paket ncdu)
lsblk -f Datenträger mit Dateisystem, UUID, Einhängepunkt
blkid 🔒 UUIDs für /etc/fstab
mount -a 🔒 /etc/fstab testen, bevor neu gestartet wird
findmnt eingehängte Dateisysteme als Baum
smartctl -a /dev/sda 🔒 SMART-Werte einer Platte (Paket smartmontools)
fstrim -av 🔒 TRIM für SSDs

Platz schaffen – typische Kandidaten:

bash
sudo journalctl --vacuum-size=500M      # Journal begrenzen
sudo apt clean && sudo apt autoremove   # Paket-Cache und alte Kernel
sudo find /var/log -name "*.gz" -mtime +30 -delete   # alte rotierte Logs
docker system df                        # Platzbedarf von Docker (siehe Abschnitt 17)

14. Webserver und Zertifikate

Apache:

Befehl Zweck
apachectl configtest 🔒 Konfiguration prüfen – vor jedem Reload
apachectl -S 🔒 alle VirtualHosts mit Datei und Zeile
apachectl -M 🔒 geladene Module
a2ensite <site> · a2dissite <site> 🔒 Site aktivieren · deaktivieren (Debian)
a2enmod proxy_http 🔒 Modul aktivieren (Debian)
systemctl reload apache2 🔒 Konfiguration übernehmen (RHEL: httpd)

nginx:

Befehl Zweck
nginx -t 🔒 Konfiguration prüfen
nginx -T 🔒 gesamte geladene Konfiguration ausgeben
systemctl reload nginx 🔒 Konfiguration übernehmen

Zertifikate:

Befehl Zweck
openssl s_client -connect example.com:443 -servername example.com </dev/null Zertifikatskette eines Servers
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -dates -subject -issuer Gültigkeit, Name, Aussteller
openssl x509 -in cert.pem -noout -text Zertifikatsdatei lesen
certbot certificates 🔒 Let’s-Encrypt-Zertifikate mit Ablaufdatum
certbot renew --dry-run 🔒 Verlängerung testen

15. Archive, Kopie und Backup

Befehl Zweck
tar -czf backup.tar.gz ordner/ Archiv packen (gzip)
tar -tzf backup.tar.gz Inhalt anzeigen, ohne zu entpacken
tar -xzf backup.tar.gz -C /ziel entpacken in ein Zielverzeichnis
zip -r archiv.zip ordner/ · unzip archiv.zip ZIP packen · entpacken
scp datei user@host:/pfad/ Datei per SSH kopieren
rsync -avh quelle/ user@host:/ziel/ synchronisieren, nur Änderungen übertragen
rsync -avh --dry-run --delete quelle/ ziel/ Probelauf: zeigt, was gelöscht würde
sha256sum datei Prüfsumme – stimmt die Kopie?

16. Zeitpläne: cron und Timer

Befehl Zweck
crontab -l eigene Cronjobs anzeigen
crontab -e eigene Cronjobs bearbeiten
sudo crontab -l -u <name> Cronjobs eines anderen Benutzers
ls /etc/cron.d /etc/cron.daily systemweite Cronjobs
systemctl list-timers systemd-Timer mit nächster Ausführung

Aufbau einer Cron-Zeile:

text
# Minute  Stunde  Tag  Monat  Wochentag  Befehl
  30      2       *    *      *          /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# -> täglich um 02:30, Ausgabe und Fehler ins Log

17. Docker

Befehl Zweck
docker ps · docker ps -a laufende · alle Container
docker logs -f --tail 100 <container> Logs live mitlesen
docker exec -it <container> sh Shell im Container
docker stats CPU und RAM je Container
docker inspect <container> alle Details (Netz, Volumes, Umgebung)
docker compose up -d Stack starten (im Verzeichnis mit compose.yaml)
docker compose pull && docker compose up -d Images aktualisieren und neu starten
docker compose logs -f Logs aller Dienste des Stacks
docker system df Platzbedarf von Images, Containern, Volumes
docker image prune ungenutzte Images löschen

18. Bash-Helfer

Schreibweise Bedeutung
befehl1 | befehl2 Ausgabe weiterreichen (Pipe)
befehl > datei · >> datei Ausgabe in Datei schreiben · anhängen
befehl 2>&1 Fehler mit in die normale Ausgabe
befehl 2>/dev/null Fehlermeldungen verwerfen
befehl1 && befehl2 zweiter Befehl nur, wenn der erste klappt
befehl1 || befehl2 zweiter Befehl nur, wenn der erste scheitert
befehl | tee datei anzeigen und in Datei schreiben
sudo !! letzten Befehl mit sudo wiederholen
echo $? Rückgabewert des letzten Befehls (0 = Erfolg)
history | grep <begriff> im Befehlsverlauf suchen
watch -n 2 <befehl> Befehl alle 2 Sekunden wiederholen
tmux · screen Sitzung, die einen Verbindungsabbruch überlebt

Tastenkürzel:

Kürzel Wirkung
Tab Befehle und Pfade vervollständigen
Strg + R rückwärts im Verlauf suchen
Strg + C laufenden Befehl abbrechen
Strg + D Sitzung beenden
Strg + L Bildschirm leeren
Strg + A · Strg + E an den Zeilenanfang · ans Zeilenende

Typische Abläufe

Problem Reihenfolge
Dienst startet nicht systemctl status <d> → journalctl -u <d> -n 50 → Konfiguration testen (-t/configtest) → ss -tulpn (Port schon belegt?)
Platte voll df -h → df -i → du -h --max-depth=1 / | sort -h → lsof +L1 → Journal/Paket-Cache aufräumen
Server langsam uptime → top → free -h (Swap?) → iostat -x 1 → journalctl -p err -b
Website nicht erreichbar systemctl status apache2 → ss -tulpn | grep :443 → curl -I http://127.0.0.1 → Firewall → DNS (dig) → Zertifikat (openssl s_client)
Nach Absturz journalctl --list-boots → journalctl -b -1 -p err → dmesg -T → smartctl -a
SSH-Anmeldung scheitert ssh -v user@host → journalctl -u ssh auf dem Server → Rechte von ~/.ssh (700) und authorized_keys (600)