Archlinux 实现动态 motd

一直很好奇阿里云的 ubuntu 的 ssh 登录时出现的信息,但/etc/motd是空的。我自己以前实现的motd只有一个figlet生成的文字,更本就不是真正的motd

花了一些时间上 github,百度,google 和 Archlinux wiki 找资料,终于搞明白大概的实现原理。

在 Archlinux 中,在用户登录ssh的时候,sshd里面的配置了pampam会调用了motd

1
2
3
# /etc/ssh/sshd_config
UsePAM yes
PrintMotd yes # pam does that
1
2
# /etc/pam.d/system-login
session optional pam_motd.so motd=/etc/motd

但是这样只是调用了motd文件,实现不了动态,换个思路:

只要我们写一个脚本,在pam执行时,不是处理/etc/motd文件,而是遍历/etc/update_motd.d/下面的脚本,这时候就能实现动态展示了。

所以我们只要执行下面几个步骤就能实现动态motd:

  1. 实现遍历/etc/update_motd.d/的脚本
  2. 修改/etc/pam.d/system-login执行update-motd脚本
  3. 编写/etc/update_motd.d/下的脚本

实现 update-motd

其实也很简单,就一行命令,但还是写成一个工具调用比较好

1
sudo vim  /usr/bin/update-motd
1
2
3
#!/bin/sh
# /usr/bin/update-motd
run-parts --lsbsysinit /etc/update-motd.d

编辑完后给这个文件执行权限

1
sudo chmod +x /usr/bin/update-motd

修改 pam 配置

1
sudo vim /etc/pam.d/system-login
1
2
3
4
+#----
+session optional pam_exec.so stdout /usr/bin/update-motd
session optional pam_motd.so motd=/etc/motd
+#----

在原来的语句上面加上执行/usr/bin/update-motd的配置,这样修改/etc/motd也一样会生效。毕竟原来的系统就支持/etc/motd,如果直接在上面改,就和以前的操作不符了。

实现 update-motd.d 脚本

1
sudo mkdir /etc/update-motd.d

在里面实现脚本即可,我把脚本推到 github 上了,直接抄作业

https://github.com/bubao/arch-nas-motd/tree/main/update-motd.d

效果

https://cdn.jsdelivr.net/gh/bubao/picgo_db@master/img/20210226060715

参考


Archlinux 实现动态 motd
https://bubao.github.io/posts/daba6ec4.html
作者
一念
发布于
2021年2月25日
许可协议