Tutorial 2: Mehr Linux-Basics: Debugging und Monitoring
Dieses Dokument ist kein eigenständiges Tutorial sondern unterstützt die Übung. Die grundlegenden Konzepte werden vorgestellt, hilfreiche Links erleichtern die selbständige Vertiefung.
Ziele:
- Ihr kennt wichtige Unix/Linux-Konzepte (Prozesse, Umgebungsvariablen, File Descriptors, Berechtigungen)
- Ihr kennt grundlegende Netzwerk-Tools
- Ihr kennt Werkzeuge und Methoden, um Probleme auf Linux-Servern zu finden und zu beheben.
- Ihr habt erste Praxiserfahrung im Debuggen von Serverproblemen
Dieses Tutorial baut auf den Kenntnissen aus dem Shell-Tutorial auf.
Rückblick: Aufgabe vom letzten Mal
Write the following Bash script:
say_count.sh which does the following:
- check whether the
cowsay
command is available on the system - if not, download the Debian package from the Debian unstable repo and install it
- download the command-line mystery (https://github.com/veltman/clmystery/archive/refs/heads/master.zip) and unpack it into a temporary directory
- find all files which contain the word „Duchess“ and let the cow say how many lines each file has
- clean up, i.e. remove the downloaded files and uninstall
cowsay
Minimal example:
#!/bin/bash if [[ ! -e /usr/games/cowsay ]] then echo "Installing cowsay" apt install -y -q cowsay fi wget https://github.com/veltman/clmystery/archive/refs/heads/master.zip unzip master.zip for f in $(grep -r --files-with-matches "Duchess" clmystery-master/*) do NUM=$(grep -o "Duchess" $f | wc -l) echo -e "Found $NUM lines in\n$(basename $f)" | /usr/games/cowsay done # cleanup apt remove -y -q cowsay rm -r clmystery-master rm master.zip
GPT4o-generated solution
Important: do not use LLMs to create shell scripts for you if you don't know much about shell scripting and the tools - subtly wrong code can corrupt the operating system
Example: ChatGPT created this script based on the requirements listed above. It contains a few things I would not do! Can you spot them?
#!/bin/bash # Check if cowsay is available if ! command -v cowsay &> /dev/null; then echo "cowsay is not installed. Installing..." # Install cowsay for Debian/Ubuntu-based systems sudo apt update wget http://ftp.us.debian.org/debian/pool/main/c/cowsay/cowsay_3.03+dfsg2-8_all.deb sudo dpkg -i cowsay_3.03+dfsg2-8_all.deb else echo "cowsay is already installed." fi # Create a temporary directory TEMP_DIR=$(mktemp -d) echo "Created temporary directory: $TEMP_DIR" # Download and unpack the mystery wget https://github.com/veltman/clmystery/archive/refs/heads/master.zip -O "$TEMP_DIR/clmystery.zip" unzip "$TEMP_DIR/clmystery.zip" -d "$TEMP_DIR" # Find files with the word "Duchess" and let the cow say how many lines each file has find "$TEMP_DIR/clmystery-master" -type f -exec grep -l "Duchess" {} \; | while read FILE; do LINE_COUNT=$(wc -l < "$FILE") cowsay "File: $FILE has $LINE_COUNT lines" done # Clean up echo "Cleaning up..." rm -rf "$TEMP_DIR" sudo apt remove --purge -y cowsay sudo apt autoremove -y rm cowsay_3.03+dfsg2-8_all.deb echo "Done!"
Vorbereitung: wir brauchen wieder eine Shell
Wir brauchen heute für die Beispiele eine simple Linux-Shell und ein paar Linux-Programme.
Option 1: Shell auf dem lokalen Rechner öffnen
Option 2: SSH nach Segfault.net
Anmelden über SSH als Nutzer root
auf einem 'disposable root server' via segfault.net.
Entweder über Putty oder über das ssh
-Programm (seit kurzem auch unter Windows verfügbar).
ssh root@segfault.net # Password is 'segfault'
Hinweis: wenn man das Passwort eingibt, werden keine Zeichen angezeigt.
Achtung: Der Server ist nicht sicher - keine vertraulichen Infos/Passwörter dort eintippen
Erster Schritt auf dem Server: Informationen zu Netzwerk-Schnittstellen prophylaktisch in einen Text-Editor kopieren
Zweiter Schritt: tmate
ausführen.
Paketmanagement unter Debian/Ubuntu
apt show <paketname>
apt search <begriff>
apt install <paketname> <paketname>
apt update
(Paketliste aktualisieren)apt upgrade
(alle Pakete aktualisieren)
Weiterführende Methoden:
- andere Repos hinzufügen (siehe
/etc/apt/sources.list
und/etc/apt/sources.list.d/
) - aus bestimmten Repos installieren (
apt install -t unstable youtube-dl
) - Pakete manuell installieren (
dpkg -i <Dateiname>
) - fehlgeschlagene Installation/Konfiguration neu starten (
apt install -f
/dpkg --configure -a
) - mit
apt-file
(separates Paket) kann man herausfinden, in welchem Paket eine bestimmte Datei steckt
Pfade und Umgebungsvariablen
Kleine Erweiterung des Themas von letzter Woche
(live)
Spannende Dateien (Linux):
(live)
- / (das Root-Verzeichnis)
- /etc/ (systemweite Konfigurationen)
- /proc/ (Informationen zu System und Prozessen)
- /sys/ (dynamische Systemkonfiguration / Systemstatus des Kernels)
Wichtig: Dateien und Verzeichnisse mit einem Punkt am Anfang ('dotfiles') werden normalerweise nicht angezeigt oder bei Wildcard-Selektionen ausgewählt. ls -a
zeigt auch solche unsichtbaren Dateien an.
Troubleshooting, Debugging, Monitoring
Tipp: Terminal zerschossen - willkürliche Zeilenumbrüche, komische Zeichen, etc.?
→ sicherheitshalber Ctrl-C drücken um einen leeren Prompt zu haben (oder q
drücken, wenn gerade less/top/… läuft). Dann stty sane<Return>
eintippen, um das Terminal auf Standardwerte zurückzusetzen.
System-Werkzeuge
- uptime
- which
- top / htop / btop
- du
- df
- fuser / lsof
- strace (-p)
Netzwerk-Tools
- ip / ifconfig / iwconfig
- route
- ping
- traceroute / mtr / tcptraceroute
- tcpdump
- ngrep
- netcat / nc
- netstat
- nmap
Logs
(live)
- cat /var/log/...
- journalctl -xe
Aufgaben
Wir beschäftigen uns mit verschiedenen Problemen auf https://sadservers.com/
- Wir schauen gemeinsam das erste Problem an
- Löst - zu zweit - vier einfache Probleme unter https://sadservers.com/scenarios (zwei davon gehen auch ohne Registrierung, eines haben wir schon gemeinsam angeschaut)
- dokumentiert die Lösungsschritte für Euch in einer Datei „sadserver-01.txt“ usw. (Tipp: der Befehl
history
zeigt die bisher eingegebenen Befehle an
Beispiel:
# Problem: Webserver geht nicht uptime # Auslastung anschauen netstat -pan | grep 80 # Lauscht überhaupt ein Server auf Port 80? ...
Best Practices
- Beim Einrichten und Debuggen die notwendigen Schritte dokumentieren
- Ein Protokoll
/root/admin.log
o.ä. pflegen, in der man alle Änderungen an einem System und Probleme dokumentiert - möglichst viel automatisieren (→ machen wir in den kommenden Terminen)