Tutorial 2: Mehr Linux-Basics: Debugging und Monitoring

ASE WS 2024/25

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.

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
#!/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

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!"

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.

  • 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

Kleine Erweiterung des Themas von letzter Woche

(live)

(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.

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.

  • uptime
  • which
  • top / htop / btop
  • du
  • df
  • fuser / lsof
  • strace (-p)
  • ip / ifconfig / iwconfig
  • route
  • ping
  • traceroute / mtr / tcptraceroute
  • tcpdump
  • ngrep
  • netcat / nc
  • netstat
  • nmap

(live) - cat /var/log/... - journalctl -xe

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?
...
  • 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)