Praktische Übungen für den Alltag mit Linux und Shell-Skripting   Vor kurzem aktualisiert!


Um am Anfang einer Fachinformatiker-Ausbildung erste Erfahrungen mit Linux-Betriebssystemen und der Shell zu sammeln habe ich eine Reihe kleinerer Aufgaben zusammengestellt.

Die Bash ist eines der mächtigsten Werkzeuge im Linux-Alltag. Egal ob Automatisierung, Systemanalyse oder einfache Dateiverwaltung – mit ein paar Skripten lassen sich viele Aufgaben effizient lösen.

20 einfache Aufgaben mit der Bash

  1. Hello World
    • Schreibe ein Bash-Skript, das „Hello, World!“ ausgibt.
  2. Date and Time
    • Schreibe ein Skript, das das aktuelle Datum und die aktuelle Uhrzeit im Format YYYY-MM-DD HH:MM:SS ausgibt.
  3. Dateiinhalt anzeigen
    • Erstelle ein Skript, das den Inhalt einer Datei anzeigt, deren Name als Argument übergeben wird.
  4. Dateien zählen
    • Schreibe ein Skript, das die Anzahl der Dateien in einem Verzeichnis zählt, das als Argument übergeben wird.
  5. Dateigröße prüfen
    • Schreibe ein Skript, das die Größe einer Datei prüft und ausgibt, ob die Datei größer als 1 MB ist.
  6. Backup erstellen
    • Erstelle ein Skript, das eine Datei in ein Backup-Verzeichnis kopiert und das Backup mit dem aktuellen Datum versieht.
  7. Benutzerabfrage
    • Schreibe ein Skript, das den Benutzer nach seinem Namen fragt und eine personalisierte Begrüßung ausgibt.
  8. Zufallszahl generieren
    • Erstelle ein Skript, das eine Zufallszahl zwischen 1 und 100 generiert und ausgibt.
  9. Ping-Test
    • Schreibe ein Skript, das eine IP-Adresse oder einen Hostnamen pingt und die Erreichbarkeit prüft.
  10. Datei suchen
    • Erstelle ein Skript, das in einem Verzeichnis und dessen Unterverzeichnissen nach einer Datei mit einem bestimmten Namen sucht.
  11. Prozessliste
    • Schreibe ein Skript, das die aktuellen laufenden Prozesse anzeigt und die Anzahl der Prozesse ausgibt.
  12. Benutzer und Gruppen
    • Erstelle ein Skript, das alle Benutzer und ihre Gruppen auflistet.
  13. Dateien umbenennen
    • Schreibe ein Skript, das alle .txt-Dateien in einem Verzeichnis in .bak umbenennt.
  14. Speichernutzung
    • Erstelle ein Skript, das die Festplattenspeichernutzung des Systems anzeigt.
  15. Netzwerk-Interfaces
    • Schreibe ein Skript, das alle aktiven Netzwerk-Interfaces und ihre IP-Adressen auflistet.
  16. Wörter zählen
    • Erstelle ein Skript, das die Anzahl der Wörter in einer Textdatei zählt, deren Name als Argument übergeben wird.
  17. Archiv erstellen
    • Schreibe ein Skript, das ein Verzeichnis in eine .tar.gz-Datei komprimiert.
  18. Log-Datei analysieren
    • Erstelle ein Skript, das eine Log-Datei durchsucht und alle Zeilen ausgibt, die ein bestimmtes Schlüsselwort enthalten.
  19. Cron-Job erstellen
    • Schreibe ein Skript, das einen neuen Cron-Job einrichtet, der täglich eine bestimmte Aufgabe ausführt.
  20. IP-Adresse ermitteln
    • Erstelle ein Skript, das die öffentliche IP-Adresse des Systems ermittelt und anzeigt (Tipp: Nutzung eines externen Dienstes wie curl ifconfig.me).

5 Aufgaben zur einfachen Logfileanalyse

  1. Fehlermeldungen extrahieren
    • Schreibe ein Skript, das eine Logdatei nach Zeilen durchsucht, die das Wort „ERROR“ enthalten, und diese Zeilen in eine separate Datei speichert. Nutze grep für diese Aufgabe.
  2. IP-Adressen filtern
    • Schreibe ein Skript, das alle eindeutigen IP-Adressen aus einer Logdatei extrahiert und sortiert. Nutze awk und sort für diese Aufgabe.
  3. Zeilen mit Zeitstempel bearbeiten
    • Schreibe ein Skript, das alle Zeilen in einer Logdatei umformatiert, indem der Zeitstempel (angenommen im Format [YYYY-MM-DD HH:MM:SS]) entfernt wird. Nutze sed für diese Aufgabe.
  4. Top 10 am häufigsten auftretende IP-Adressen
    • Schreibe ein Skript, das die 10 häufigsten IP-Adressen in einer Logdatei ermittelt und sortiert ausgibt. Nutze awk, sort, uniq und head für diese Aufgabe.
  5. Bestimmte Felder aus Logdatei extrahieren
    • Schreibe ein Skript, das bestimmte Felder (zum Beispiel den Zeitstempel und die Fehlermeldung) aus einer Logdatei extrahiert und formatiert ausgibt. Nutze cut und awk für diese Aufgabe.

5 Aufgaben zum Umgang mit Dateien/Dateisystem

  1. Verzeichnisse archivieren
    • Schreibe ein Skript, das alle Verzeichnisse in einem angegebenen Verzeichnis findet und jeweils ein .tar.gz-Archiv erstellt.
  2. Alte Dateien löschen
    • Schreibe ein Skript, das alle Dateien in einem Verzeichnis findet, die älter als 30 Tage sind, und diese löscht. Nutze find und eine for-Schleife.
  3. Benutzerinteraktion
    • Schreibe ein Skript, das den Benutzer nach einem Verzeichnis fragt und überprüft, ob es existiert. Wenn es existiert, werden die Dateien im Verzeichnis gezählt und angezeigt. Nutze while, if und case.
  4. Automatisiertes Backup
    • Schreibe ein Skript, das alle .txt-Dateien in einem Verzeichnis findet und diese in ein tägliches Backup-Verzeichnis verschiebt. Das Backup-Verzeichnis soll das aktuelle Datum als Namen haben.
  5. Dateigrößen überprüfen
    • Schreibe ein Skript, das durch alle Dateien in einem Verzeichnis iteriert und die Dateien anzeigt, die größer als 100 MB sind. Nutze find, for und if.

Aufgaben zum Umgang im/mit dem Linux-Betriebssystem

  1. Übersicht der Softwareversionen
    • Schreibe ein Skript welches die installierte Software auf einem System (Linux-Version, Kernel-Version, Pakete, Docker, Snap, Flathub) strukturiert in einer XML-Datei abspeichert 
  2. Einfache Benachrichtigung per E-Mail
    • Schreibe ein Skript, welches eine E-Mail sendet, sobald sich jemand auf dem System über eine SSH-Verbindung anmeldet.

Rsync

  1. Lokale Datensicherung mit Erhalt der Metadaten
    • Erstelle mit rsync ein Backup eines Projektverzeichnisses in einen Backup-Ordner und achte dabei darauf, dass Berechtigungen, Zeitstempel und der detaillierte Übertragungsstatus (v-Option) beibehalten werden.
  2. Spiegelung und Bereinigung mittels Dry-Run
    • Synchronisiere das Quellverzeichnis so mit dem Backup, dass gelöschte Dateien auch im Ziel entfernt werden (–delete), und teste den Befehl zur Sicherheit zuerst im Simulationsmodus (–dry-run).
  3. Remote-Synchronisation über eine sichere SSH-Verbindung
    • Übertrage ein lokales Verzeichnis auf einen entfernten Server, indem du rsync über das SSH-Protokoll nutzt, um Daten verschlüsselt zwischen zwei verschiedenen Systemen zu spiegeln.

Lösungen

Hier geht es zu den Lösungsvorschlägen

🧩 20 einfache Bash-Aufgaben

1. Hello World

Schreibe ein Skript, das einfach:

echo "Hello, World!"

ausgibt.


2. Datum und Uhrzeit

Gib das aktuelle Datum im Format YYYY-MM-DD HH:MM:SS aus:

date "+%F %T"

3. Dateiinhalt anzeigen

Übergib einen Dateinamen als Argument:

cat "$1"

4. Dateien zählen

Zähle Dateien in einem Verzeichnis:

ls -1 "$1" | wc -l

5. Dateigröße prüfen

if [ $(stat -c%s "$1") -gt 1048576 ]; then
  echo "Größer als 1 MB"
fi

6. Backup erstellen

cp "$1" backup/$(date +%F)_$(basename "$1")

7. Benutzerabfrage

read -p "Name: " name
echo "Hallo $name!"

8. Zufallszahl

echo $((RANDOM % 100 + 1))

9. Ping-Test

ping -c 1 "$1" && echo "Erreichbar" || echo "Nicht erreichbar"

10. Datei suchen

find "$1" -name "$2"

11. Prozesse anzeigen

ps aux | tee /dev/tty | wc -l

12. Benutzer & Gruppen

cut -d: -f1 /etc/passwd

13. Dateien umbenennen

for f in *.txt; do mv "$f" "${f%.txt}.bak"; done

14. Speicherverbrauch

df -h

15. Netzwerk-Interfaces

ip a

16. Wörter zählen

wc -w "$1"

17. Archiv erstellen

tar -czf archiv.tar.gz "$1"

18. Log-Datei durchsuchen

grep "$2" "$1"

19. Cron-Job erstellen

(crontab -l; echo "0 0 * * * /pfad/zum/script.sh") | crontab -

20. Öffentliche IP-Adresse

curl -s ifconfig.me

📊 5 Aufgaben zur Logfile-Analyse

🔍 Fehlermeldungen extrahieren

grep "ERROR" logfile.log > errors.log

🌐 IP-Adressen filtern

awk '{print $1}' logfile.log | sort | uniq

🧹 Zeitstempel entfernen

sed 's/\[[^]]*\] //g' logfile.log

🔝 Top 10 IPs

awk '{print $1}' logfile.log | sort | uniq -c | sort -nr | head -10

📑 Bestimmte Felder extrahieren

awk '{print $1, $5}' logfile.log

📁 Arbeiten mit Dateien & Dateisystem

📦 Verzeichnisse archivieren

for d in */; do tar -czf "$d.tar.gz" "$d"; done

🗑️ Alte Dateien löschen

find "$1" -type f -mtime +30 -delete

🤝 Benutzerinteraktion

read -p "Verzeichnis: " dir
if [ -d "$dir" ]; then
  echo "Dateien: $(ls "$dir" | wc -l)"
fi

🔄 Automatisiertes Backup

dest=$(date +%F)
mkdir -p "$dest"
find . -name "*.txt" -exec mv {} "$dest" \;

📏 Große Dateien finden

find "$1" -type f -size +100M

🐧 Linux-Systemaufgaben

📋 Softwareübersicht als XML

Idee:

  • uname -a
  • Paketlisten (dpkg, rpm)
  • Docker / Snap / Flatpak

→ Ausgabe strukturieren in XML (z. B. mit echo und Tags)

#!/bin/bash
# sysinfo_xml.sh

OUTPUT_FILE="/tmp/sysinfo.xml"
TIMESTAMP=$(date "+%Y-%m-%dT%H:%M:%S")

{
echo "<?xml version='1.0' encoding='UTF-8'?>"
echo "<systemreport host='$(hostname)' generated='$TIMESTAMP'>"

# OS & Kernel
echo "  <base>"
echo "    <os>$(grep 'PRETTY_NAME' /etc/os-release | cut -d= -f2 | tr -d '"')</os>"
echo "    <kernel>$(uname -sr)</kernel>"
echo "  </base>"

# DPKG
echo "  <packages manager='dpkg'>"
dpkg-query -W -f='    <package><name>${Package}</name><version>${Version}</version></package>\n' | head -n 50
echo "  </packages>"

# Docker
if command -v docker &> /dev/null; then
    echo "  <docker version='$(docker --version | awk '{print $3}' | tr -d ',')'>"
    docker ps -a --format "    <container><name>{{.Names}}</name><image>{{.Image}}</image><status>{{.Status}}</status></container>"
    echo "  </docker>"
fi

# Snap
if command -v snap &> /dev/null; then
    echo "  <snaps>"
    snap list 2>/dev/null | tail -n +2 | awk '{print "    <snap><name>"$1"</name><version>"$2"</version></snap>"}'
    echo "  </snaps>"
fi

echo "</systemreport>"
} > "$OUTPUT_FILE"

📧 E-Mail bei SSH-Login

Ansatz:

  • /etc/ssh/sshrc , ~/.bash_profile oder PAM-Hook nutzen
  • Script mit mail oder sendmail
who -l -u  | mail -s "Informations-E-Mail login" Empfaenger@domain.de

🔄 rsync-Aufgaben

💾 Lokales Backup

rsync -av quelle/ ziel/

🧪 Dry-Run + Spiegelung

rsync -av --delete --dry-run quelle/ ziel/

🔐 Remote-Sync via SSH

rsync -av -e ssh quelle/ user@server:/ziel/