Loggt man sich per SSH auf einem Raspberry Pi ein, bekommt man immer dieselbe Nachricht angezeigt: Viel Text, wenig Information und auch nicht besonders schön. Es handelt sich dabei um die „Mitteilung des Tages“ (Message of the day = MOTD). Um diesen Text zu entfernen ist garnicht viel Aufwand nötig, denn er wird als reiner Text in der Datei /etc/motd gespeichert. Also brauchen wir ihn nur aus der entsprechenden Datei entfernen.
Inhalt
MOTD Teil 1
Dazu verbinden wir uns per SSH auf den Raspberry Pi und setzen folgenden Befehl ab:
$ sudo nano /etc/motd
Zusehen bekommen wir auch direkt die Login-Nachricht:
Die löschen wir einfach oder schreiben beliebigen Text hinein, speichern die Änderungen, trennen die Verbindung und loggen uns neu ein. Schon werden wir ganz ohne, oder mit unserer eigenen Nachricht begrüßt.
MOTD Teil 2
Was bleibt sind zwei Zeilen, die bei Bedarf ebenfalls noch ausgeschaltet werden können. Zeile 1 Linux raspberrypi 4.1.13+ #826 PREEMPT... wird in der Datei /etc/init.d/motd erzeugt. Um das zu verhindern, laden wir die Datei im Editor …
$ sudo nano /etc/init.d/motd
… und kommentieren Zeile 21 aus:
#!/bin/sh
### BEGIN INIT INFO
# Provides: motd
# Required-Start: hostname $local_fs
# Required-Stop:
# Should-Start:
# Default-Start: 1 2 3 4 5
# Default-Stop:
# Short-Description: Create dynamic part of /etc/motd
# Description: /etc/motd is user-editable and static. This script
# creates the initial dynamic part, by default the
# output of uname, and stores it in /var/run/motd.dynamic.
# Both parts are output by pam_motd.
### END INIT INFO
PATH=/sbin:/usr/sbin:/bin:/usr/bin
. /lib/init/vars.sh
do_start () {
# Update motd
#uname -snrvm > /var/run/motd.dynamic
}
do_status () {
if [ -f /var/run/motd.dynamic ] ; then
return 0
else
return 4
fi
}
case "$1" in
start|"")
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
status)
do_status
exit $?
;;
*)
echo "Usage: motd [start|stop|status]" >&2
exit 3
;;
esac
:
SSH-Nachrichten
Die zweite Zeile der Login-Nachricht wird vom SSH-Daemon erzeugt und lässt sich in dessen Einstellungsdatei abschalten.
$ sudo nano /etc/ssh/sshd_config
Hier suchen wir den Eintrag PrintLastLog yes und ändern ihn zu PrintLastLog no.
... # GSSAPI options #GSSAPIAuthentication no #GSSAPICleanupCredentials yes X11Forwarding yes X11DisplayOffset 10 PrintMotd no PrintLastLog no CPKeepAlive yes #UseLogin no #MaxStartups 10:30:60 #Banner /etc/issue.net ...
Während sich das Verändern von MOTD sofort auswirkt, werden die letzten beiden Änderungen erst nach einem Neustart aktiv. Mit diesen Einstellungen erhält man nach dem Login nur noch den Prompt, ohne jeglichen weiteren Text.
Grafische Gestaltung
Beispiel 1: Himbeere
Wenn es dann doch etwas mehr sein darf, dann geht auch noch etwas mehr, als statischer Text. An verschiedenen Stellen im Internet wird beschrieben, wie man sich seine eigene Mitteilung des Tages, nebst dynamischen Informationen zum Systemzustand, erstellen kann. Dabei ist vieles möglich: farbige Schrift, Datum/Uhrzeit, Uptime, CPU-Temperatur, IP-Adressen, … Daraus habe ich mir mal etwas zusammengebastelt, und für die bessere Darstellung mein Terminal auf schwarz umgestellt.
Auch das ist kein großes Ding: Quellcode des nachfolgenden Scripts hernehmen, beliebig anpassen, und irgendwo auf dem Raspberry Pi abspeichern. Bei mir liegt die Datei unter /home/pi/welcome.sh.
#!/bin/sh
# dynamische MOTD
# Aufruf in /etc/profile (letzte Zeile)
# Datum & Uhrzeit
DATUM=`date +"%A, %e %B %Y"`
# Hostname
HOSTNAME=`hostname -f`
# letzter Login
LAST1=`last -2 -a | awk 'NR==2{print $3}'` # Wochentag
LAST2=`last -2 -a | awk 'NR==2{print $5}'` # Tag
LAST3=`last -2 -a | awk 'NR==2{print $4}'` # Monat
LAST4=`last -2 -a | awk 'NR==2{print $6}'` # Uhrzeit
LAST5=`last -2 -a | awk 'NR==2{print $10}'` # Remote-Computer
# 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
# Durchschnittliche Auslasung
LOAD1=`cat /proc/loadavg | awk '{print $1}'` # Letzte Minute
LOAD2=`cat /proc/loadavg | awk '{print $2}'` # Letzte 5 Minuten
LOAD3=`cat /proc/loadavg | awk '{print $3}'` # Letzte 15 Minuten
# Temperatur
TEMP=`vcgencmd measure_temp | cut -c "6-9"`
# Speicherbelegung
DISK1=`df -h | grep 'dev/root' | awk '{print $2}'` # Gesamtspeicher
DISK2=`df -h | grep 'dev/root' | awk '{print $3}'` # Belegt
DISK3=`df -h | grep 'dev/root' | awk '{print $4}'` # Frei
# Arbeitsspeicher
RAM1=`free -h -o | grep 'Mem' | awk '{print $2}'` # Total
RAM2=`free -h -o | grep 'Mem' | awk '{print $3}'` # Used
RAM3=`free -h -o | grep 'Mem' | awk '{print $4}'` # Free
RAM4=`free -h -o | grep 'Swap' | awk '{print $3}'` # Swap used
# IP-Adressen ermitteln
if ( ifconfig | grep -q "eth0" ) ; then IP_LAN=`ifconfig eth0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_LAN="---" ; fi ;
if ( ifconfig | grep -q "wlan0" ) ; then IP_WLAN=`ifconfig wlan0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_WLAN="---" ; fi ;
echo "\033[1;32m .~~. .~~. \033[1;36m$DATUM
\033[1;32m '. \ ' ' / .'
\033[1;31m .~ .~~~..~. \033[0;37mHostname......: \033[1;33m$HOSTNAME
\033[1;31m : .~.'~'.~. : \033[0;37mLetzter Login.: $LAST1, $LAST2 $LAST3 $LAST4 von $LAST5
\033[1;31m ~ ( ) ( ) ~ \033[0;37mUptime........: $UP1 Tage, $UP2:$UP3 Stunden
\033[1;31m( : '~'.~.'~' : ) \033[0;37mØ Auslastung..: $LOAD1 (1 Min.) | $LOAD2 (5 Min.) | $LOAD3 (15 Min.)
\033[1;31m ~ .~ ( ) ~. ~ \033[0;37mTemperatur....: $TEMP °C
\033[1;31m ( : '~' : ) \033[0;37mSpeicher......: Gesamt: $DISK1 | Belegt: $DISK2 | Frei: $DISK3
\033[1;31m '~ .~~~. ~' \033[0;37mRAM (MB)......: Gesamt: $RAM1 | Belegt: $RAM2 | Frei: $RAM3 | Swap: $RAM4
\033[1;31m '~' \033[0;37mIP-Adressen...: LAN: \033[1;35m$IP_LAN\033[0;37m | WiFi: \033[1;35m$IP_WLAN
\033[m"
Anschließend muss das Script nur noch ausführbar gemacht und automatisch bei jedem Login ausgeführt werden. Dazu setzen wir folgenden Befehl ab…
$ sudo chmod 777 /home/pi/welcome.sh
…bearbeiten die Datei /etc/profile und fügen am Ende den Script-Aufruf an:
$ sudo nano /etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).
if [ "`id -u`" -eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/us$
fi
export PATH
if [ "$PS1" ]; then
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then
# The file bash.bashrc already sets the default PS1.
# PS1='\h:\w\$ '
if [ -f /etc/bash.bashrc ]; then
. /etc/bash.bashrc
fi
else
if [ "`id -u`" -eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
# The default umask is now handled by pam_umask.
# See pam_umask(8) and /etc/login.defs.
if [ -d /etc/profile.d ]; then
for i in /etc/profile.d/*.sh; do
if [ -r $i ]; then
. $i
fi
done
unset i
fi
/home/pi/welcome.sh
Bei jedem Login wird nun das Script ausgeführt und dessen Ausgabe direkt vorm Prompt angezeigt.
Beispiel 2: Lautsprecher
Weiteres Beispiel gefällig? Das verwende ich bei meinen WLAN-Lautsprechern.
#!/bin/sh
# dynamische MOTD
# Aufruf in /etc/profile (letzte Zeile)
# Datum & Uhrzeit
DATUM=`date +"%A, %e %B %Y"`
# Hostname
HOSTNAME=`hostname -f`
# letzter Login
LAST1=`last -2 -a | awk 'NR==2{print $3}'` # Wochentag
LAST2=`last -2 -a | awk 'NR==2{print $5}'` # Tag
LAST3=`last -2 -a | awk 'NR==2{print $4}'` # Monat
LAST4=`last -2 -a | awk 'NR==2{print $6}'` # Uhrzeit
LAST5=`last -2 -a | awk 'NR==2{print $10}'` # Remote-Computer
# 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
# Durchschnittliche Auslasung
LOAD1=`cat /proc/loadavg | awk '{print $1}'` # Letzte Minute
LOAD2=`cat /proc/loadavg | awk '{print $2}'` # Letzte 5 Minuten
LOAD3=`cat /proc/loadavg | awk '{print $3}'` # Letzte 15 Minuten
# Temperatur
TEMP=`vcgencmd measure_temp | cut -c "6-9"`
# Speicherbelegung
DISK1=`df -h | grep 'dev/root' | awk '{print $2}'` # Gesamtspeicher
DISK2=`df -h | grep 'dev/root' | awk '{print $3}'` # Belegt
DISK3=`df -h | grep 'dev/root' | awk '{print $4}'` # Frei
# Arbeitsspeicher
RAM1=`free -h -o | grep 'Mem' | awk '{print $2}'` # Total
RAM2=`free -h -o | grep 'Mem' | awk '{print $3}'` # Used
RAM3=`free -h -o | grep 'Mem' | awk '{print $4}'` # Free
RAM4=`free -h -o | grep 'Swap' | awk '{print $3}'` # Swap used
# IP-Adressen ermitteln
if ( ifconfig | grep -q "eth0" ) ; then IP_LAN=`ifconfig eth0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_LAN="---" ; fi ;
if ( ifconfig | grep -q "wlan0" ) ; then IP_WLAN=`ifconfig wlan0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_WLAN="---" ; fi ;
echo "\033[38;5;166m @@@.
\033[38;5;166m '@@@@. \033[1;36m$DATUM\033[m
\033[38;5;166m .@@ @@@@.
\033[38;5;166m .@@@@ @@@. @@@@. \033[0;37mHostname.: \033[1;33m$HOSTNAME\033[m
\033[38;5;166m .@@@@@@@ @@@@. @@@@. \033[0;37mL. Login.: $LAST1, $LAST2 $LAST3 $LAST4 von $LAST5
\033[38;5;166m@@@@@@@@@@@@@@ @@@@ '@@@@ \033[0;37mUptime...: $UP1 Tage, $UP2:$UP3 Stunden
\033[38;5;166m@@@@@@@@@@@@@@ @@@: @@@@.
\033[38;5;166m@@@@@@@@@@@@@@ @@@@ @@@@: \033[0;37mØ-Ausl...: $LOAD1 (1m) | $LOAD2 (5m) | $LOAD3 (15m)
\033[38;5;166m@@@@@@@@@@@@@@ @@@: @@@@' \033[0;37mTemp.....: $TEMP °C
\033[38;5;166m@@@@@@@@@@@@@@ @@@@ .@@@@ \033[0;37mSpeicher.: Gesamt: $DISK1 | Belegt: $DISK2 | Frei: $DISK3
\033[38;5;166m '@@@@@@@ @@@@' @@@@' \033[0;37mRAM (MB).: Gesamt: $RAM1 | Belegt: $RAM2 | Frei: $RAM3
\033[38;5;166m '@@@@ @@@' @@@@'
\033[38;5;166m '@@ @@@@' \033[0;37mIP-Adr...: LAN: \033[1;35m$IP_LAN\033[m
\033[38;5;166m ,@@@@' \033[0;37m WiFi: \033[1;35m$IP_WLAN\033[m
\033[38;5;166m @@@'
\033[m"
Beispiel 3: FHEM
Und noch ein Beispiel:
#!/bin/sh
# dynamische MOTD
# Aufruf in /etc/profile (letzte Zeile)
# Datum & Uhrzeit
DATUM=`date +"%A, %e %B %Y"`
# Hostname
HOSTNAME=`hostname -f`
# letzter Login
LAST1=`last -2 -a | awk 'NR==2{print $3}'` # Wochentag
LAST2=`last -2 -a | awk 'NR==2{print $5}'` # Tag
LAST3=`last -2 -a | awk 'NR==2{print $4}'` # Monat
LAST4=`last -2 -a | awk 'NR==2{print $6}'` # Uhrzeit
LAST5=`last -2 -a | awk 'NR==2{print $10}'` # Remote-Computer
# 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
# Durchschnittliche Auslasung
LOAD1=`cat /proc/loadavg | awk '{print $1}'` # Letzte Minute
LOAD2=`cat /proc/loadavg | awk '{print $2}'` # Letzte 5 Minuten
LOAD3=`cat /proc/loadavg | awk '{print $3}'` # Letzte 15 Minuten
# Temperatur
TEMP=`vcgencmd measure_temp | cut -c "6-9"`
# Speicherbelegung
DISK1=`df -h | grep 'dev/root' | awk '{print $2}'` # Gesamtspeicher
DISK2=`df -h | grep 'dev/root' | awk '{print $3}'` # Belegt
DISK3=`df -h | grep 'dev/root' | awk '{print $4}'` # Frei
# Arbeitsspeicher
RAM1=`free -h -o | grep 'Mem' | awk '{print $2}'` # Total
RAM2=`free -h -o | grep 'Mem' | awk '{print $3}'` # Used
RAM3=`free -h -o | grep 'Mem' | awk '{print $4}'` # Free
RAM4=`free -h -o | grep 'Swap' | awk '{print $3}'` # Swap used
# IP-Adressen ermitteln
if ( ifconfig | grep -q "eth0" ) ; then IP_LAN=`ifconfig eth0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_LAN="---" ; fi ;
if ( ifconfig | grep -q "wlan0" ) ; then IP_WLAN=`ifconfig wlan0 | grep "inet Adresse" | cut -d ":" -f 2 | cut -d " " -f 1` ; else IP_WLAN="---" ; fi ;
echo "
\033[0;33m .@. \033[1;36m$DATUM\033[m
\033[0;33m .:@\033[0;32m@@@\033[0;33m@:.
\033[0;33m .:@\033[0;32m@' '@\033[0;33m@:. \033[0;37mHostname.: \033[1;33m$HOSTNAME\033[m
\033[0;33m .::@\033[0;32m@' '@\033[0;33m@::. \033[0;37mL. Login.: $LAST1, $LAST2 $LAST3 $LAST4 von $LAST5
\033[0;33m.:@\033[0;32m@' '@\033[0;33m@:. \033[0;37mUptime...: $UP1 Tage, $UP2:$UP3 Stunden
\033[0;33m @\033[0;32m@ .:@:' ':@:. @\033[0;33m@
\033[0;33m @\033[0;32m@ @\033[0;33m@ \033[0;37mØ-Ausl...: $LOAD1 (1m) | $LOAD2 (5m) | $LOAD3 (15m)
\033[0;33m @\033[0;32m@ . . @\033[0;33m@ \033[0;37mTemp.....: $TEMP °C
\033[0;33m @\033[0;32m@ '@ @' @\033[0;33m@ \033[0;37mSpeicher.: Gesamt: $DISK1 | Belegt: $DISK2 | Frei: $DISK3
\033[0;33m @\033[0;32m@ '@@:,,,:@@' @\033[0;33m@ \033[0;37mRAM (MB).: Gesamt: $RAM1 | Belegt: $RAM2 | Frei: $RAM3
\033[0;33m @\033[0;32m@ @\033[0;33m@
\033[0;33m @\033[0;32m@@@@@@@@@@@@@@@@@@@@@\033[0;33m@ \033[0;37mIP-Adr...: LAN: \033[1;35m$IP_LAN\033[m
\033[0;33m '''''''''''''''''''''''
\033[m"
Synology
Im Synology-Forum gibt es mittlerweile einen Thread mit Anpassungen für die Synology DiskStation.
Nützliche Links
Eine Webseite, die die Formatierungsmöglichkeiten von bash ziemlich gut beschreibt:
Diskussionen und nette Beispiele sind hier zu finden:
- https://www.raspberrypi.org/forums/viewtopic.php?t=23440
- https://www.raspberrypi.org/forums/viewtopic.php?p=78678
/etc/motd geschrieben werden kann. Was jedoch meist unerwähnt bleibt ist, dass es sich dabei um eine reine Text-Datei handelt, die die Sonderzeichen zur Formatierung und farbigen Hervorhebung dann eben auch als Text ausgibt, was meiner Meinung nach etwas unschön aussieht. ASCII-Art-Webseiten
- http://www.incredibleart.org/links/ascii/bob_allison_ascii.html
- http://patorjk.com/software/taag/#p=testall&h=3&v=2&c=bash&f=Graffiti&t=Raspberry%20Pi
- http://www.chris.com/ascii/
ASCII-Converter
- Proxmox: „Failed to connect to Server“ mit Safari auf MacOS - 28. Januar 2023
- Loxone: Benachrichtigung per Telegram - 15. Januar 2022
- Telegram: Nachrichten per Bot von der Heimautomation aufs Handy - 2. Januar 2022







26 Comments