I would like to have a dynamic motd, but I can’t figure out how to do it.
I tried what I found, adding
90-footer, and symlinking to
I’ve got these lines in
# Print the message of the day upon successful login. # 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
I’m also confused with systemd.
Is there a way to do this? Could someone provide a example with a simple fortune?
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
This has changed over the years:
First there was
Then Ubuntu came up with their own package
update-motd based on a script called from cron.
Finally, PAM copied Ubuntu’s idea of /etc/update-motd.d/, and therefore Debian and others also have that behaviour.
There is an explanation here
So this is how things are currently: PAM will just read
/etc/motd if it exists (paste from post)
/etc/motd– The classic, static file. Does not exist anymore in Ubuntu 16.04 LTS, not even as a symbolic link to /var/run/motd. If it is created, however its contents will be printed too.
/var/run/motd– This was used by Ubuntu’s first implementation. It is not used anymore. It is just ignored by PAM.
/var/run/motd.dynamic– This is what is shown on login currently. It is updated by /etc/init.d/motd at every boot. It is also updated by PAM by running the scripts in /etc/update-motd.d/, if they exist.
/etc/motd.tail– The Ubuntu package used to populate /etc/update-motd.d. One of them would cat the contents of this file so it was easy to add static content. That script does not exist in the package anymore, so the file does not have the intended effect.
The example from the post
mkdir /etc/update-motd.d rm -f /etc/motd # in Debian still exists cat > /etc/update-motd.d/10logo <<EOF #!/bin/sh echo cat /etc/issue EOF cat > /etc/update-motd.d/20updates <<'EOF' #!/bin/sh echo echo "uptime is $( uptime )" echo "date is $( date )" EOF chmod a+x /etc/update-motd.d/*
I am able to test simple dynamic-motd with fortune example on my Debian Jessie 8.2 host as below and found the issue to be related to a buggy behavior.
mkdir /etc/update-motd.d cd /etc/update-motd.d
Created two test files as below and made them executable
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="23514c4c57634746414a424d">[email protected]</a>:/# cd /etc/update-motd.d/ <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e3918c8c97a38786818a828d">[email protected]</a>:/etc/update-motd.d# ls -l total 8 -rwxr-xr-x 1 root root 58 Dec 1 23:21 00-header -rwxr-xr-x 1 root root 41 Dec 1 22:52 90-fortune <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="087a67677c486c6d6a616966">[email protected]</a>:/etc/update-motd.d# cat 00-header #!/bin/bash echo echo 'Welcome !! This is a header' echo <a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8bf9e4e4ffcbefeee9e2eae5">[email protected]</a>:/etc/update-motd.d# cat 90-fortune #!/bin/bash echo /usr/games/fortune echo
However at this time, there was no change in motd. So i strace’d sshd process.From that trace (interesting parts shown below), you can see that newly created motd.new file is renamed to /var/run/motd. However it’s later trying to read from /run/motd.dynamic – which was never created
20318 rename("/var/run/motd.new", "/var/run/motd") = 0 20318 open("/run/motd.dynamic", O_RDONLY) = -1 ENOENT (No such file or directory) 20318 open("/etc/motd", O_RDONLY) = 8
The issue seem to be related to inconsistencies with pam_motd module. See bug report https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=743286;msg=2
Simply changing motd file location from
/etc/pam.d/sshd – makes it work for me
<a href="https://getridbug.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a4d6cbcbd0e4c0c1c6cdc5ca">[email protected]</a>:/etc/pam.d# grep pam_motd sshd #session optional pam_motd.so motd=/run/motd.dynamic session optional pam_motd.so motd=/run/motd session optional pam_motd.so noupdate
Here is the sample MOTD seen during ssh login …
Welcome !! This is a header * Culus fears perl - the language with optional errors The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. You have new mail. Last login: Tue Dec 1 23:49:57 2015 from x.x.x.x
You may also try these files for script execution.
/etc/profile used for?
These files are used to set environmental items for a users shell. Items such as umask, and variables such as PS1 or PATH.
~/.bashrc used for?
This file is meant for setting command aliases and functions used by bash shell users.
When are these files used?
The difference is simple, the
/etc/profile is executed only for interactive shells and the
~/.bashrc is executed for both interactive and non-interactive shells. In fact in Ubuntu the
/etc/profile calls the