Debian Jessie Dynamic MOTD

If you have ever used Ubuntu Server then you should be familiar with the dynamic MOTD.  This is what is presented to the user in terminal when a log on occurs.
ubuntu-motd
This feature is very nice as it will give you a quick look at useful information. Unfortunately, Debian Server does not include the dynamic MOTD. This tutorial is based on our previous article Debian Wheezy Dynamic MOTD. First you will need to install some prerequisites and build the directory structure. To do so, run the following commands in terminal. If you would like to add update notification, I have written another article detailing the steps at Debian MOTD Update Notifier.

# install lsb-release 
sudo apt-get install lsb-release
# install figlet to enable ASCII art
sudo apt-get install figlet
# create directory
mkdir /etc/update-motd.d/
# change to new directory
cd /etc/update-motd.d/
# create dynamic files
touch 00-header && touch 10-sysinfo && touch 90-footer
# make files executable
chmod +x /etc/update-motd.d/*
# remove MOTD file
rm /etc/motd
# symlink dynamic MOTD file
ln -s /var/run/motd /etc/motd

Once the above commands have been run, you can move on to populating the files you created. Below you can copy and paste.

Header (00-header)

#!/bin/sh
#
#    00-header - create the header of the MOTD
#    Copyright (c) 2013 Nick Charlton
#    Copyright (c) 2009-2010 Canonical Ltd.
#
#    Authors: Nick Charlton <hello@nickcharlton.net>
#             Dustin Kirkland <kirkland@canonical.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

[ -r /etc/lsb-release ] && . /etc/lsb-release

if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
        # Fall back to using the very slow lsb_release utility
        DISTRIB_DESCRIPTION=$(lsb_release -s -d)
fi

figlet $(hostname)
printf "\n"

printf "Welcome to %s (%s).\n" "$DISTRIB_DESCRIPTION" "$(uname -r)"
printf "\n"

System Information (10-sysinfo)

#!/bin/bash
#
#    10-sysinfo - generate the system information
#    Copyright (c) 2013 Nick Charlton
#
#    Authors: Nick Charlton <hello@nickcharlton.net>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

date=`date`
load=`cat /proc/loadavg | awk '{print $1}'`
root_usage=`df -h / | awk '/\// {print $(NF-1)}'`
memory_usage=`free -m | awk '/Mem:/ { total=$2 } /buffers\/cache/ { used=$3 } END { printf("%3.1f%%", used/total*100)}'`
swap_usage=`free -m | awk '/Swap/ { printf("%3.1f%%", "exit !$2;$3/$2*100") }'`
users=`users | wc -w`
time=`uptime | grep -ohe 'up .*' | sed 's/,/\ hours/g' | awk '{ printf $2" "$3 }'`
processes=`ps aux | wc -l`
ip=`ifconfig $(route | grep default | awk '{ print $8 }') | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'`

echo "System information as of: $date"
echo
printf "System load:\t%s\tIP Address:\t%s\n" $load $ip
printf "Memory usage:\t%s\tSystem uptime:\t%s\n" $memory_usage "$time"
printf "Usage on /:\t%s\tSwap usage:\t%s\n" $root_usage $swap_usage
printf "Local Users:\t%s\tProcesses:\t%s\n" $users $processes
echo
#!/bin/sh
#
#    90-footer - write the admin's footer to the MOTD
#    Copyright (c) 2013 Nick Charlton
#    Copyright (c) 2009-2010 Canonical Ltd.
#
#    Authors: Nick Charlton <hello@nickcharlton.net>
#             Dustin Kirkland <kirkland@canonical.com>
#
#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License along
#    with this program; if not, write to the Free Software Foundation, Inc.,
#    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

[ -f /etc/motd.tail ] && cat /etc/motd.tail || true

Once these files are populated with the above, you should now be able to logout and then log back in either using putty or on the console and you will be presented with something that looks like below.motd-debian8

 

Did you find this article useful? Why not share it with your friends?

6 thoughts on “Debian Jessie Dynamic MOTD

  1. thank you for your work

    in the header i used

    toilet -f standard -F metal $(hostname)
    since figlet $(hostname)

    looks like more cooler with some color

  2. I’ve adated your howto as an ansible Script. Unfortunately it’s only working until an reboot of the system. On Stretch it woks every time, even after reboot. But on Jessie the motd will only shown after an fresh setup.

    The Problem seems to be athat pam.d tries to load the motd.dynamic file in /var/run.
    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=743286;msg=2

    So to make the motd work even after reboots, you have to change the /etc/pam.d/ssh config:

    from:
    | session optional pam_motd.so motd=/run/motd.dynamic
    to:
    | session optional pam_motd.so motd=/run/motd

    And then reboot. Seems to work now every time.

  3. ip not shown

    System information as of: Mon Mar 28 09:52:37 AST 2016

    System load: 0.10 IP Address:
    Memory usage: 0.0% System uptime: 1:06 hours
    Usage on /: 19% Swap usage: 0.0%
    Local Users: 2 Processes: 135

    ifconfig
    eth0: flags=4163 mtu 1500
    inet 192.168.1.20 netmask 255.255.255.0 broadcast 192.168.1.255
    inet6 fe80::21e:6ff:fec3:9592 prefixlen 64 scopeid 0x20
    ether 00:1e:06:c3:95:92 txqueuelen 1000 (Ethernet)
    RX packets 6349 bytes 1366252 (1.3 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 5627 bytes 1371984 (1.3 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    device interrupt 40

    lo: flags=73 mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    inet6 ::1 prefixlen 128 scopeid 0x10
    loop txqueuelen 0 (Local Loopback)
    RX packets 57 bytes 4364 (4.2 KiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 57 bytes 4364 (4.2 KiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.