Wer regelmäßig Linux Server administriert, wird immer wieder die selben Handgriffe durchführen um sicherzustellen, dass das System wie gewünscht läuft. Sind das nur wenige Systeme, wird das üblicherweise via SSH direkt durchgeführt, da sich die Pflege entsprechender Werkzeuge für die remote Pflege kaum rechnet. Warum also nicht gleich ein Script erstellen welches zumindest die schnell auszuführenden Befehle absetzt und lediglich die wichtigen Daten herausfiltert und anzeigt. Über eine der profile Dateien oder eine bashrc kann das dann direkt bei jeder Anmeldung am System passieren.

Auf einem Linux PC muss man dafür nichts installieren, was nicht auch auf dem zu administrierenden Server existiert. Auf dem Windows PC hilft das Windows Subsystem für Linux, welches ich hier auch zur Erstellung der Grafiken verwenden werde. Ich nutze dafür ein Ubuntu 24.04, welches auch auf meinen Webservern zum Einsatz kommt, so muss ich das fertige Script nach der Übertragung auf den Server nur wenig anpassen. So sollte das in etwa am Ende aussehen:

Ubuntuin der WSL

Windows Subsystem für Linux (wsl)

Wer auf einer Linux Maschine arbeitet, kann diesen Abschnitt überspringen und direkt im Terminal arbeiten, für Windows Maschinen würde ich aber das WSL zum Testen vorschlagen, denn das sollte nicht auf einem produktiven Server gemacht werden. Um die Shells der Distributionen aufzurufen nutze ich das Windows-Terminal, welches sich aus einer mit administrativer Berechtigung gestarteten PowerShell mit WinGet einfach installieren lässt:

winget install Microsoft.WindowsTerminal

Windows-Terminal

Das Terminal bietet Karteikarten um mehrere Shells zu organisieren und lässt neben dem Aufruf von Eingabeaufforderung und Powershell auch den direkten Start der installiereten Distributionen zu

Voraussetzungen für WSL

Windows 10, Version 2004 und höher (Build 19041 und höher) oder Windows 11

WSL-Befehl installieren

Der Befehl wsl.exe --install installiert die WSL mit der Standard-Distribution Ubuntu (reboot erforderlich). Um eine Liste der verfügbaren Linux-Distributionen anzuzeigen, die über den Online-Store heruntergeladen werden können, gibt es den Befehl: wsl --list –online und die lassen sich mit dem Befehl wsl install [Distribution] installieren. Eine Vollständige Anleitung gibt es bei Microsoft.

Wichtig ist dabei die WSL 2 Nutzung für die verwendete Distribution einzustellen. Mit dem Befehl wsl -l -v werden alle installierten Distributionen mit ihrem aktuellen Status und der verwendeten WSL Version aufgelistet. Das Sternchen zeigt dabei auf die Standard Distribution.

WSL-l-v

Mit wsl.exe --set-version [DistroName] 2 wird eine Distribution auf die Version 2 umgestellt, wsl.exe --set-default-version 2 setzt die Version als Standard für alle danach installierten Distributionen und ein wsl.exe --set-default [DistroName] macht die angegebene Distribution zum Standard.

Das Anmeldescript

Erstellt eine neue Datei in eurem Home Verzeichnis und öffnet sie mit eurem präferiertem Editor. Ich nutze dafür Visual Studio Code, VIM, Nano oder MCEdit sind aber auch Optionen.

touch ./welcome.sh
code ./welcome.sh

Begonnen wird mit dem Shebang, welcher in jedes Script in die erste Zeile gehört um sicherzustellen, das die Shell genutzt wird, die mit der Syntax in unserem Script umgehen kann.

#!/usr/bin/env bash

Dann folgt ein Header zur Dokumentation. Wollt ihr euer Script öffentlich zugänglich machen, gehört hinter den Autor noch eine E-Mail Adresse.

# dynamische Message of the day (MOTD) für Ubuntu
# Aufruf in profile (letzte Zeile)
#
# Autor: Christian Schmidt
# Datum: 01. Mai 2026
# Lizenz: GPL-2.0

Das Datum

Mit dem Datumsbefehl date kann das Datum ausgegeben werden. Je nach Lokalisierung gibt das unterschiedliche Ergebnisse, aber wir können ihm Parameter mitgeben um das Ergebnis zu formatieren (siehe man date) und in einer Variablen ablegen:

# Datum und Uhrzeit
DATUM=date +"%A, %e %B %Y"

Der Hostname

Der Hostname kann mit dem gleichlautenden Befehl ausgegeben werden. Ein -f als Parameter gibt den voll qualifizierten Hostnamen (Fully Qualified Domain Name (FQDN)) zurück, welcher sich auch gleich in eine Variable speichern lässt:

# Hostname
HOSTNAME=`hostname -f`

IP Adressen

Hier wird es etwas aufwändiger. Wir müssen nicht nur die richtigen Felder finden, sondern auch den Schnittstellennamen, der uns interessiert. Nutze zunächst den Befehl ip a um eine Ausgabe ählich dieser, mit allen Netzwerkschnittstellen zu erhalten:

IP-a

Da uns das Loopback-Device nicht interessiert, wäre der Name der Netzwerkschnittstelle in diesem Beispiel eth0, die IPv4 Adresse ist die nächste Spalte hinter inet und die IPv6 Adresse befindet sich in der nächsten Spalte hinter inet6. Damit können wir auch diese Daten in je eine Variable schreiben:

# IP Adressen
IPV4=`ip addr show eth0 | grep -vw "inet6" | grep "global" | grep -w "inet" | cut -d/ -f1 | awk '{ print $2 }'`
IPV6=`ip addr show eth0 | grep -vw "inet" | grep "link" | grep -w "inet6" | cut -d/ -f1 | awk '{ print $2 }'`

Der Reihe nach! Befehle können mit dem Pipe Symbol | verkettet werden. Dabei wird ein Kommando links des Pipe Symbols bzw. dessen Ausgabe an das Kommando rechts des Pipe Symbols übergeben. Setzen wir das einmal für die IPv4 Adresse zusammen.

  • ip addr show eth0 gibt uns aus dem oberen Beispiel nur die Schnittstelle eth0 aus
  • grep -vw "inet6" sucht darin jetzt (Parameter -w) nach inet6 und gibt dann aber alles Andere aus (Parameter -v)
  • grep "global" sucht darin jetzt nach global und gibt die Zeile in der das gefunden wird aus
  • cut -d/ -f1 schneidet bis zum Trennzeichen / (-d/) alle Felder bis Nummer 1 (-f1, wir zählen von 0) aus und gibt das Ergebnis aus
  • awk '{ print $2 }' gibt dann daraus das zweite Feld (wir zählen von 1) als Ergebnis zurück Die Befehlskette für die IPv6 Adresse müsstest du dir damit selbst erklären können. Wie bereits beim Datum empfohlen, sieh die einzelnen Befehle im Manual nach (man (Kommando)).

Laufzeit (seit Reboot)

Unter Linux ist alles eine Datei und so lassen sich viele relevante Informationen aus dem virtuellen Prozessdateisystem unterhalb von /proc auslesen. So auch die Uptime aus /proc/uptime. Die Zeit in Sekunden seit dem letzten Start des Systems steht dort im ersten Feld, welches wir zur Errechnung der benötigten Felder nutzen können:

# Uptime
UP0=`cut -d. -f1 /proc/uptime`
UP1=$(($UP0/86400))        # Tage
UP2=$(($UP0/3600%24))      # Stunden
UP3=$(($UP0/60%60))        # Minuten
UP4=$(($UP0%60))           # Sekunden

Letzte Anmeldung

Jede Anmeldung wird mit weiteren Informationen dazu in /var/log/wtmp (ausser Debian 13 Trixie) in Binärform gespeichert, deren Daten das last Kommando bereitstellen kann.

last-2-a

# letzter Login
LAST1=`last -2 -a | awk 'NR==2{print $4}'`    # Wochentag
LAST2=`last -2 -a | awk 'NR==2{print $6}'`    # Tag
LAST3=`last -2 -a | awk 'NR==2{print $5}'`    # Monat
LAST4=`last -2 -a | awk 'NR==2{print $7}'`    # Uhrzeit
LAST5=`last -2 -a | awk 'NR==2{print $11}'`   # Remote-Computer

Wir suchen uns aus dem auf zwei Einträge beschränkten (-2) Ergebnis von last mit awk, aus der zweiten Zeile (NR=2) jeweils ein Feld (print $(Feldnummer beginnend bei 1)) um es in einer Variablen abzulegen. Der Parameter „-a“ veranlasst last dazu den Remotecomputer an die letzte Stelle zu setzen. Auf einem per ssh erreichten System ist das die IP Adresse des sich anmeldenden Benutzers.

Systemauslastung

Vorheriger Beitrag