给服务器设置动态motd效果

SSH连接到学校的服务器,感觉登录后的提示信息看起来很舒服,想给自己的服务器也加上一个。

motd

根据维基百科的介绍,motd 的全称是“message of the day”,通常被管理员用来给所有用户发送信息,最初就是在用户登录成功后显示 /etc/motd 文本文件的内容。
但随着时间的推移,一些 Linux 发行版(例如 Debian,Ubuntu 等)已经开始使用动态的 motd 信息提示了。与之前的静态 motd 的不同之处在于,动态 motd 会在登录后显示当前系统的一些状态信息,每次都有所不同,而不是 /etc/motd 里一成不变的文本内容(除非管理员手动修改)。

伪动态motd

学校服务器是 CentOS 6,系统本身应该是没有提供动态 motd 的,查看了一下它的实现,是给 root 用户设置了 crontab 定时任务,每分钟执行一次 /usr/local/bin/motd.sh 来更新 /etc/motd 的内容,然后当用户登录时显示的还是 /etc/motd 的内容,只不过是定时任务刚刚更新过的。虽然算是实现了伪动态 motd,但感觉不够优雅,毕竟 /etc/motd 只是在登录时才会用到,每分钟更新一次感觉十分多余。
查找相关资料时看到有提到 Linux PAM 模块中 pam_motd.so 的,不过我尝试在 ArchLinux 的 /etc/pam.d/login 最后一行加上或去掉 pam_motd.so,以及改变 motd 指定的路径,再次登录时并没有发现什么变化,依然显示的是 /etc/motd 的内容,感觉与动态 motd 并没有什么关系。既然没办法直接使用动态 motd,那么只能退而求其次,寻找显示效果尽量相同的其它方法了。我选择了在 /etc/profile.d/ 创建一个 motd.sh 脚本,在用户登录时系统会自动运行,显示的内容取决于脚本内容。
(这应该只能算是实现了动态 motd 的效果,实际上已经跟 /etc/motd 没多少关系了)

显示内容

学校服务器登录后显示:
pioneer_motd 仿照它的显示内容,我希望我的服务器在我登录后能够显示:

Linux 下有一个显示系统信息的小工具叫做 neofetch,我的脚本中用到的 Logo 标志就来源于这里,其它发行版的 Logo 也可以在这里找到。
给 Logo 加颜色的话,可以使用转义字符。例如在终端中执行echo -e "\033[0;31;40mWrong\033[0m"时,显示的就是默认效果,黑色背景,红色文字的 Wrong。
其中两个分号分隔开的三个数字分别表示:

Memory

根据这里的讨论结果,已用内存的计算公式为:MemUsed = Memtotal + Shmem - MemFree - Buffers - Cached - SReclaimable,各项的大小从 /proc/meminfo 中读取。

Load average

Load average 直接从 /proc/loadavg 中读取,分别对应一分钟,五分钟,二十分钟的平均负载。

Time

服务器本机时间直接运行 date 命令显示即可。

Users

想要查看当前登录用户数量,可以使用 who 命令然后统计行数。要注意 Linux 如果运行图形界面的话,一个用户可能在 who 命令的结果中占多行,例如我自己电脑上开机登录进图形界面后就会有 tty1,pts/0 两行,再打开新的 Konsole 窗口就会出来更多的 pts。
对于没有图形界面的服务器来说,打开一个 SSH 连接才会多出一个pts,开机时也不会占用 tty,所以可以直接根据打开了几个 pts 来确定当前有几个用户登录。

最终效果

ali_motd motd.sh 地址:https://github.com/whoisnian/script/blob/master/motd.sh