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