Linux中创建自己的MOTD[通俗易懂]

2022-09-20 10:06:40 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

1)什么是MOTD

  motd:是英文缩写message of the day 。译文是:每日提示信息,问候报文。那你为什么要用MOTD?其实目的很简单,是提示进入系统的用户注意事项,或提示系统运行的概要信息让用户更好的了解系统。在Linux系统要实现自己的MOTD,首先需要认识/etc/motd文件。

  •  /etc/motd文件是什么?

    在linux世界中“一切皆文件”,/etc/motd也是众多文件之一;那它有什么特别之处?/etc/motd文件作用是:每次系统登陆时,通过终端展示一些消息给登陆用户,如向用户提示欢迎信息,或提示使用系统的注意事项等等信息像公告板一样为所有用户提示信息。然而在/etc/motd文件只能添加静态信息,而如果你想在用户登录时对提供动态的系统信息,如IP地址、系统负载等时,/etc/motd就无能为力了。但在/etc/motd显示静态信息内容时,可以对静态文字增加颜色,以达到对重点信息内容的突出显示。

  此外,作为ssh访问系统用户必须配置/etc/ssh/sshd_config文件。

代码语言:javascript复制
1 vim  /etc/ssh/sshd_config
2 ……
3 PrintMotd yes           #远程用户登录时是否打印/etc/motd文件信息           
4 ……         

2)如何显示静态MOTD

  如果想在用户登陆时显示静态内容信息,只需要修改/etc/motd文件。同时还可在/etc/motd文件中还可以添加颜色及背景色,让原本静态内容更加生动更具提示效果。要想实现上述效果,必须在静态信息内容前加上<ESC>[{attr};{fg};{bg}m 来提示xterm虚拟终端怎样来显示内容。

  • 显示虚拟终端类型
代码语言:javascript复制
1 $ env | grep TERM
2 $ set | grep TERM              //或用set
  • 提示终端添加颜色及背景的语句格式
代码语言:javascript复制
<ESC>[{attr};{fg};{bg}m

  格式描述:     1.<ESC> :可以在vim中输入Ctrl V后再按ESC。

    2.{attr} :表示属性,包括下划线,加粗等属性。

  • 0 Reset All Attributes (return to normal mode) :恢复通用模式
  • 1 Bright (usually turns on BOLD) :加粗
  • 2 Dim
  • 3 Underline :下划线
  • 5 Blink
  • 7 Reverse
  • 8 Hidden

    3.{fg} :表示字体颜色

  • 30 Black :黑色
  • 31 Red :红色
  • 32 Green :绿色
  • 33 Yellow :黄色
  • 34 Blue :蓝色
  • 35 Magenta :紫红色
  • 36 Cyan :青色
  • 37 White :白色

    4.{bg} :表示背景色

  • 40 Black :黑色
  • 41 Red :红色
  • 42 Green :绿色
  • 43 Yellow :黄色
  • 44 Blue :蓝色
  • 45 Magenta :紫红色
  • 46 Cyan :青色
  • 47 White :白色

  案例:     

代码语言:javascript复制
1 [root@ecs-elk  ~]#vim /etc/motd
2 
3 ^[[0;31;40m Welcome to Huawei Cloud Service ^[[0;37;40m
4 
5 
6 [root@ecs-elk  ~]#

3)如何显示动态MOTD

  静态内容在提示公共信息上有效,但当用户登录系统时更多是需要了解系统运行状态及一些系统信息。自然就需要显示动态的信息内容。比如ip地址、硬盘占用、进程数等。那么怎么来实现上述动态的内容?那么首先看看linux用户登录及加载bash配置文件过程:

  用户登录时相关bash配置文件:

    1)全局配置文件:      

  • /etc/profile
  • /etc/profile.d/*.sh
  • /etc/bashrc

    2)个人配置文件:   

  • ~/.bsah_profile
  • ~/.bashrc

  那么当一个linux用户在交互式登录时这些bash配置文件及/etc/motd加载顺序:  

代码语言:javascript复制
1 #交互式登录,/etc/motd和shell加载配置文件过程
2 /etc/motd -->/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

  登录式shell加载配置文件过程:如使用su – tom

代码语言:javascript复制
1 #如命令: su  - tom
2 #登录式shell加载配置文件过程
3 /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

  非登录式shell加载配置文件过程:如使用 su tom

代码语言:javascript复制
1 #如命令: su tom
2 #非登录式shell加载配置文件过程
3 ~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

  但在测试用户在交互式登录时bash配置文件及/etc/motd加载顺序,出现如下偏差如图:

  之后查看相关bash配置文件,发现/etc/profile配置文件文中调用/etc/profile.d/*.sh,而用于验证的echo显示命令位于配置文件末尾。故产生认知错误。

注:验证时 最好仔细看一下相关配置文件 并将验证的echo命令位于配置文件前面位置。否则会可能带来认知错误。

  综述:

    因为/etc/motd只能显示静态内容,所以想要实现MOTD动态信息必须通过上述linux用户登录时相关bash配置文件,并在相关bash配置文件中添加可执行脚本命令来实现动态信息。例如编写一个shell脚本文件,并将该脚本在/etc/profile配置文件中执行。

代码语言:javascript复制
 1 [root@db57 ~]# vim /usr/src/scripts/system_info.sh  2 #!/bin/bash  3  4 date=`date " %F %T"`  5 head="System's date is: $date"  6  7 kernel=`uname -r`  8 hostname=`echo $HOSTNAME`  9 10 echo 11 echo "                          " 12 echo "$head" 13 echo "--------------------------" 14 printf "Kernel :t%sn" $kernel 15 printf "HostName:t%sn" $hostname 16 17 [root@db57 ~]#chmod  x /usr/src/scripts/system_info.sh 18 [root@db57 ~]#tail -1 /etc/profile 19 /usr/src/scripts/system_info.sh

注1:在实现动态信息中除了使用shell脚本外,也可以使用python脚本。

注2:摘自《Linux服务器安全策略配置-SSH与动态MOTD(一)》

    如果你使用过Debian/Ubuntu分发版,你可能已经发现,Ubuntu默认就已经有一个动态的MOTD信息提示(通过SSH或本地登录时显示系统当前的一些信息)。在RHEL/CentOS中不可能实现像在Debian/Ubuntu中这样的功能,因为RHEL/CentOS并没有提供与之相关的任何脚本。我们可以通过环境变量文件,如/etc/profile、/etc/bashrc等,将需要执行的命令或脚本添加到这些文件末尾,这样当每次用户登陆时,系统就会读取这些文件,执行文件里定义好的脚本。除此之外,也可以结合使用crontab计划任务,将预先准备好的脚本,如系统监控,异常信息收集通过crontab在后台定期执行,并把收集到的信息重定向写到/etc/motd文件中。在用户登录系统时,就可以显示这些系统监控、异常处理信息了。

    在Ubuntu中,提供了一组脚本在目录/etc/update-motd.d/中,在用户登录时,按照脚本名字前缀的数字(00-99)顺序执行,并将这些脚本的输出保存到文件/run/motd.dynamic中,最终用户成功登录后,在登录的屏幕界面中打印出来。

小结:

/etc/motd文件可实现静态MOTD内容;动态MOTD需通过脚本在linux用户登录的bash配置文件执行,Ubuntu中提供了/etc/update-motd.d/目录来实现动态MOTD。

引出问题:

1)xterm虚拟终端,及颜色内容显示

2)linux用户的交互式登录;登录式shell和非登录式shell

3)printf命令

参考:

http://ju.outofmemory.cn/entry/139743

https://blog.51cto.com/7424593/1922111

https://www.linuxjournal.com/article/8603

https://www.cnblogs.com/justart/p/7688624.html

https://segmentfault.com/a/1190000015684318

https://blog.csdn.net/dreams_deng/article/details/77196444

https://yq.aliyun.com/articles/560280

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168380.html原文链接:https://javaforall.cn

0 人点赞