ssh-Login aufhübschen
Um hier nicht nur Fragen zu stellen, möchte ich den Wissenspool hier etwas mit erweitern.
Heute habe ich mich für das optische Aufhübschen beim ssh-Zugriff entschieden.
Dieser Beitrag ist im Laufe der Zeit, dank den Hinweisen, etwas umgeschrieben worden.
1. Ausgaben vor dem Login
2. Ausgabe beim Login
2.1 motd (Message of the day)
2.1.1 update-motd.d-Skripte
2.1.2 Dann noch der Inhalt von /etc/motd
2.1.3 Demo
2.2. weitere Möglichkeiten
1. Ausgaben vor dem Login
Es ist immer wieder schön, wenn der Rechner bei einer ssh-Anfrage sich vorstellt. Falls man sich vertippt hat und damit den falschen Rechner erwischt, wird es einem dann (meistens) gewahr.
Diese Meldung nennt sich bei ssh Banner.
Ein Blick in die /etc/ssh/sshd_config gibt Aufschluß:
Kein Banner definiert.
Die Meldung, die ausgegeben werden soll, wird in eine Datei geschrieben. Ich verwende dafür traditionell /etc/ssh/mblt.
Dann mit dem Editor Eurer Wahl die Meldung, die Ihr ausgeben wollt, in die Datei schreiben.
Ich habe immer sinngemäß folgendes drin:
Nach einem Hinweis sei erwähnt, daß das Banner von jedem, der auf dem Rechner übers Netz zugreifen kann, diese Meldung lesen kann. Also NICHT den Benutzernamen und oder das Passwort da reinpacken!
===============================
Login to: hostname.in-addr.arpa
-------------------------------
Und jetzt noch das Ganze in der /etc/ssh/sshd_config aktivieren:
(am besten ist es, die folgende Zeile unter #Banner none zu schreiben; bei Verwendung anderer Dateinamen, diese entsprechend anpassen)
2. Ausgabe beim Login
Hier kann man seiner Phantasie freien Lauf lassen und hat dafür verschiedene Möglichkeiten. Zum einen über /etc/motd, der zentralen /etc/ssh/sshrc oder ganz individuell für jeden User, der in seinem Home-Verzeichnis eine ~/.ssh/rc anlegt. Vielleicht gibt es auch noch mehr Möglichkeiten.
2.1 motd (Message of the day)
Um motd nutzen zu können, muß man sicherstellen, das ssh pam nutzt und motd in pam aktiviert ist.
$ grep -i 'usepam' /etc/ssh/sshd_config
UsePAM yes
$ grep motd /etc/pam.d/sshd
# This includes a dynamically generated part from /run/motd.dynamic
# and a static (admin-editable) part from /etc/motd.
session optional pam_motd.so motd=/run/motd.dynamic
session optional pam_motd.so noupdate
Wenn in der /etc/pam.d/sshd motd deaktiviert ist, kann man in der /etc/ssh/sshd_config durch Änderung des Wertes PrintMotd no auf PrintMotd yes die Ausgabe der (reinen) Textdatei /etc/motd erzielen. Wenn allerdings in der /etc/pam.d/sshd motd akiviert ist, sollte PrintMotd auf no stehen, da sonst diese Datei zweimal angezeigt wird. Das ist (zumindest in Bookworm) die Default-Einstellung.
2.1.1. update-motd.d-Skripte
Der Vorteil von motd ist, das die auch beim lokalen Login über tty/pts angezeigt werden können. Darauf gehe ich hier aber nicht ein.
Zuerst werden die Skripte, die unter /etc/update-motd.d liegen abgearbeitet und dann wird der Inhalt von /etc/motd angezeigt. Und wenn Ihr es nicht abgeschalten habt, wird noch der Lastlogin angezeigt.
Da es relativ simpel ist, mache ich das mal selbsterklärend (einiges geht sicher besser):
~ $ ls -lh /etc/update-motd.d/
total 12K
-rwxr-xr-x 1 root root 187 Feb 29 14:11 10-uname
-rwxr-xr-x 1 root root 237 Feb 29 14:11 20-pi-info
-rwxr-xr-x 1 root root 129 Feb 29 14:11 50-uptime
~ $ cat /etc/update-motd.d/10-uname
#!/bin/sh
# uname -snrvm
echo '==============================================================================='
k=$(uname -r | cut -d'-' -f1)
o=$(uname -o)
m=$(uname -m)
echo "$o $m $k"
~ $ cat /etc/update-motd.d/20-pi-info
#!/bin/sh
temperatur=$(/usr/bin/vcgencmd measure_temp | /usr/bin/tr -d "temp=")
osName=$(/usr/bin/grep '^PRETTY_NAME=' /etc/os-release | cut -d'"' -f2)
printf 'Betriebssystem: %s\n' "$osName"
printf 'CPU-Temperatur: %s\n' "$temperatur"
~ $ cat /etc/update-motd.d/50-uptime
#!/bin/sh
# uptime
ups=$(uptime -s)
upp=$(uptime -p)
printf 'gebootet am : %s\n' "$ups"
printf 'Systemuptime : %s\n' "$upp"
Display More
2.1.2. Dann noch der Inhalt von /etc/motd
cat /etc/motd
===============================================================================
Willkommen auf der Plattform eines
______ _ ______ _ _____
| ___ \ | | | ___ (_) |____ |
| |_/ /__ _ ___ _ __ | |__ ___ _ __ _ __ _ _ | |_/ /_ / /
| // _` / __| '_ \| '_ \ / _ \ '__| '__| | | | | __/| | \ \
| |\ \ (_| \__ \ |_) | |_) | __/ | | | | |_| | | | | | .___/ /
\_| \_\__,_|___/ .__/|_.__/ \___|_| |_| \__, | \_| |_| \____/
| | __/ |
|_| |___/
===============================================================================
Display More
Die ASCII-Art läßt sich mit figlet oder irgend einem ASCII-Art-Generator im Web erzeugen.
Danach wird noch der Lastlogin ausgegeben.
Wers nicht mag, kann es abschalten. Ich finde es allerdings nützlich.
Lastlog ausschalten:
Jetzt den Daemon noch neu starten und dann sollte der ssh-Login hübscher und informativer sein.
2.1.3. Demo
Und so sieht das bei meinem Pi 3B+ aus:
========================
Login to: pi3.mein.netz
------------------------
bergwichtel@pi3's password:
===============================================================================
GNU/Linux armv7l 6.6.20+rpt
Betriebssystem: Raspbian GNU/Linux 12 (bookworm)
CPU-Temperatur: 40.8'C
gebootet am : 2024-03-13 18:57:27
Systemuptime : up 56 minutes
===============================================================================
Willkommen auf der Plattform eines
______ _ ______ _ _____
| ___ \ | | | ___ (_) |____ |
| |_/ /__ _ ___ _ __ | |__ ___ _ __ _ __ _ _ | |_/ /_ / /
| // _` / __| '_ \| '_ \ / _ \ '__| '__| | | | | __/| | \ \
| |\ \ (_| \__ \ |_) | |_) | __/ | | | | |_| | | | | | .___/ /
\_| \_\__,_|___/ .__/|_.__/ \___|_| |_| \__, | \_| |_| \____/
| | __/ |
|_| |___/
===============================================================================
Last login: Wed Mar 13 19:28:37 2024 from 10.10.10.10
Display More
2.2. weitere Möglichkeiten
Es wurde in der Diskussion zu diesem Artikel noch auf die /etc/ssh/sshrc bzw. die Usereigene ~/.ssh/rc hingewiesen. Was in gewissen Grenzen ebenfalls funktioniert. Aber eine Aussage in der man 8 ssh unter SSHRC hat mich dazu bewogen, hier nicht darauf einzugehen. Da steht, daß der Hauptzweck dieser Datei darin besteht, alle Initialisierungsroutinen auszuführen, die erforderlich sind, bevor das Home-Verzeichnis des Benutzers zugänglich wird. Und der entscheidende Punkt für meine Entscheidung ist:
Wenn die Datei ~/.ssh/rc existiert, führt sh(1) sie aus, nachdem es die Umgebungsdateien gelesen hat, aber bevor es die Shell oder den Befehl des Benutzers startet. Es darf keine Ausgabe auf stdout erzeugen; stattdessen muss stderr verwendet werden.
Der Vorteil von ~/.ssh/rc ist, wenn man keine Adminrechte hat, kann man sich entsprechendes basteln.
Edit (15.0.6.24): Je nachdem, was in der rc steht, funktioniert bei mir dann scp nicht mehr.
Man kann auch die ~/.profile dafür mißbrauchen, in dem man am Ende folgendes Konstrukt anfügt:
if [ -n "$SSH_CONNECTION" ] ; then
# was ich so angezeigt bekommen möchte
echo "SSH_CONNECTION $SSH_CONNECTION"
# oder ein Skript aufrufen
if [ -x $HOME/.ssh/meinMOTD.sh ] ; then
$HOME/.ssh/meinMOTD.sh
fi
fi
Sicherlich gibt es noch mehr Möglichkeiten, aber ich möchte es bei dem Genannten bewenden lassen.