一、背景认知
1.1 什么是motd标志区
motd全称Message of the Day(每日消息),是Linux系统(含openEuler)在用户完成终端登录(本地控制台登录、SSH远程登录)后,自动展示在命令行界面的文本信息区域,即登录后的欢迎/公告/提示信息展示区,无需用户手动触发,登录后自动显示。
1.2 openEuler 24.03 LTS SP3中motd的核心作用
-
系统公告推送:运维人员向所有登录用户发布系统维护通知、安全预警、使用规范等,确保所有用户及时获取关键信息;
-
系统状态展示:实时展示CPU负载、内存使用率、磁盘空间、本机IP地址等运维核心信息,无需手动执行free、df等命令查看;
-
安全合规提示:展示授权访问声明、操作审计提示、行业合规要求等,满足企业级服务器安全管理需求;
-
个性化定制:打造专属登录界面,可区分测试环境与生产环境,提升运维辨识度,避免误操作。
1.3 openEuler 24.03 LTS SP3中motd的技术特性
-
兼容Linux标准PAM认证机制,支持静态文本+动态脚本双模式,比传统/etc/motd配置更灵活,可满足不同场景需求;
-
基于DNF包管理器,可扩展安装update-motd框架,实现模块化动态配置,便于脚本管理和功能扩展;
-
适配SELinux安全机制,默认权限管控符合企业级安全基线,无需额外修改安全配置即可正常使用;
-
支持多用户差异化展示、条件触发告警等进阶能力,完美适配企业服务器运维场景。
二、核心配置
本章节明确motd所有相关配置文件、目录、权限规则,是初学者理解motd生效逻辑的核心基础,所有配置文件路径、权限均为默认值,无特殊需求请勿随意修改。
2.1 底层生效核心:PAM认证模块
openEuler的motd显示由PAM(可插拔认证模块)控制,核心是pam_motd.so模块,这是motd生效的底层基础,系统默认已配置完成,无需手动修改。
-
本地控制台登录配置文件:/etc/pam.d/login
-
SSH远程登录配置文件:/etc/pam.d/sshd
openEuler 24.03 LTS SP3默认已在上述两个文件中启用pam_motd.so模块,默认配置如下(无需修改):
session optional pam_motd.so
session optional pam_motd.so noupdate
⚠️ 注意:初学者无特殊需求,严禁修改这两个文件,否则可能导致系统登录异常,无法正常进入终端。
2.2 静态motd核心配置文件
静态motd适用于无需实时更新的固定内容(如欢迎语、使用规范),配置简单,零门槛适合初学者入门,核心配置如下:
|------|--------------------------------------|
| 配置项 | 详情 |
| 文件路径 | /etc/motd |
| 核心作用 | 纯静态文本配置,直接写入的文本内容会在用户登录后直接展示,无任何执行逻辑 |
| 默认权限 | 644(root用户读写,其他用户只读) |
| 所有者 | root:root |
2.3 动态motd核心配置目录
动态motd适用于需要实时更新的内容(如系统负载、IP地址),通过脚本实现内容动态生成,核心配置如下:
|--------|-----------------------------------------------------------------------|
| 配置项 | 详情 |
| 目录路径 | /etc/update-motd.d/ |
| 核心作用 | 动态motd的模块化脚本目录,目录下的可执行shell脚本,会按数字前缀从小到大的顺序依次执行,脚本的标准输出内容会拼接成完整motd展示 |
| 目录默认权限 | 755 |
| 目录所有者 | root:root |
动态脚本核心执行规则(初学者必记)
-
脚本必须以数字开头命名(如00-header、10-sysinfo),数字越小执行优先级越高,显示位置越靠前;
-
脚本必须拥有可执行权限(755),所有者必须为root:root,其他用户不可有写权限,否则PAM会出于安全考虑禁止执行;
-
脚本开头必须有shebang行(#!/bin/bash 或 #!/bin/sh),否则无法正常执行;
-
脚本执行异常不会影响用户正常登录,仅对应内容不显示,可手动测试排查错误。
2.4 关联配置:SSH服务参数
SSH服务参数控制SSH登录时是否额外打印motd内容,若配置不当会导致motd内容重复显示,核心配置如下:
|------|---------------------------------------|
| 配置项 | 详情 |
| 文件路径 | /etc/ssh/sshd_config |
| 核心参数 | PrintMotd |
| 作用 | 控制SSH服务是否主动打印/etc/motd内容 |
| 最佳实践 | 设置为no,仅通过PAM控制motd显示,避免两者同时开启导致内容重复显示 |
| 默认权限 | 600 |
| 所有者 | root:root |
2.5 权限核心规则(安全红线)
motd相关配置的权限直接影响系统安全,以下权限规则必须严格遵守,禁止违规修改:
|--------------------------|------|-----------|--------------------|
| 配置对象 | 推荐权限 | 所有者 | 强制要求 |
| /etc/motd | 644 | root:root | 禁止给其他用户写权限 |
| /etc/update-motd.d/ 目录 | 755 | root:root | 禁止给其他用户写权限 |
| /etc/update-motd.d/ 下的脚本 | 755 | root:root | 必须有可执行权限,禁止其他用户写权限 |
| /etc/pam.d/login、sshd | 644 | root:root | 无特殊需求禁止修改 |
| /etc/ssh/sshd_config | 600 | root:root | 严格控制权限,禁止其他用户读取/写入 |
三、基础实操
本章节从零开始,全步骤无省略,所有操作均需root权限(普通用户可在命令前加sudo),初学者照着操作即可100%成功,每一步均标注操作目的和注意事项。
前置准备
-
已安装openEuler 24.03 LTS SP3操作系统,确保系统可正常启动;
-
拥有root权限或sudo权限(普通用户需知道sudo密码);
-
可通过本地控制台或SSH工具(如Xshell、Putty)登录系统;
-
系统已配置好软件源,可正常使用dnf命令(若无法使用,需先配置系统软件源)。
3.1 实操一:静态motd基础配置(零门槛入门)
目标:自定义登录后的静态欢迎信息,无复杂逻辑,快速上手,适合初学者首次配置motd。
步骤1:切换至root权限
普通用户无法修改motd相关配置,需先切换至root权限,执行以下命令:
普通用户切换root,输入root密码(密码输入时不显示,输入完成按回车)
su - root
或使用sudo获取root权限(输入当前普通用户密码)
sudo -i
步骤2:备份原始配置文件(必做,防止改坏无法恢复)
修改任何系统配置前,备份原始文件是良好习惯,执行以下命令备份/etc/motd:
按日期备份,避免备份文件覆盖(如20241001为备份日期)
cp /etc/motd /etc/motd.bak.$(date +%Y%m%d)
步骤3:查看当前默认motd内容
执行以下命令,查看系统默认的motd内容(部分系统默认为空):
cat /etc/motd
步骤4:编辑/etc/motd文件,写入自定义内容
推荐初学者使用nano编辑器(操作简单,底部有明确提示),执行以下命令打开编辑器:
nano /etc/motd
打开后,写入自定义内容(示例如下,可直接复制修改):
=============================================
欢迎使用 openEuler 24.03 LTS SP3
=============================================
⚠️ 注意:本系统仅限授权人员访问,所有操作将被审计记录
�� 系统维护时间:每月最后1个周日 00:00-06:00
�� 运维联系:admin@example.com
=============================================
编辑完成后,按以下步骤保存退出(严格按照顺序操作):
-
按下 Ctrl+O(写入文件,底部会提示"File Name to Write: /etc/motd");
-
按下 Enter(确认保存路径,不要修改路径);
-
按下 Ctrl+X(退出nano编辑器,返回终端)。
步骤5:验证配置效果
静态motd配置无需重启任何服务,即时生效,验证方法:
-
新开一个终端窗口(或关闭当前终端,重新打开);
-
重新登录系统(输入账号密码);
-
登录后即可看到刚才自定义的motd内容,说明配置成功。
步骤6:异常恢复方案(改坏了直接用)
若修改后motd不显示、显示异常,或想恢复默认配置,执行以下命令,用备份文件还原:
用当天的备份文件还原(若备份日期不是当天,修改后面的日期即可)
cp /etc/motd.bak.$(date +%Y%m%d) /etc/motd
3.2 实操二:SSH配置优化(解决内容重复显示问题)
初学者最常见的踩坑:motd内容登录时显示2次,根源是SSH服务和PAM同时开启了motd打印,本操作一步解决,全程无风险。
步骤1:备份SSH配置文件(必做)
SSH配置文件修改错误会导致SSH服务无法启动,无法远程登录,先执行备份:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%Y%m%d)
步骤2:修改PrintMotd参数
执行以下命令,用nano编辑器打开SSH配置文件:
nano /etc/ssh/sshd_config
在文件中找到"PrintMotd"相关行(可按Ctrl+W,输入PrintMotd搜索),修改为以下内容:
PrintMotd no
⚠️ 注意:若文件中没有PrintMotd行,直接在文件末尾添加上述内容即可。
步骤3:验证配置语法(必做,防止SSH服务启动失败)
修改完成后,执行以下命令,验证配置文件语法是否正确:
sshd -t
若命令执行后没有任何输出,说明语法正确;若有报错,根据提示修改错误(通常是拼写错误),不要继续下一步。
步骤4:重启SSH服务使配置生效
语法验证正确后,执行以下命令,重启SSH服务:
systemctl restart sshd
⚠️ 注意:若通过SSH远程登录操作,重启SSH服务后会暂时断开连接,重新连接即可。
步骤5:验证效果
重新登录系统(本地或远程),motd内容不会再重复显示,仅显示一次,说明配置成功。
3.3 实操三:动态motd基础配置(展示实时系统信息)
目标:创建动态motd脚本,登录时自动展示系统实时信息(内核版本、CPU负载、内存、磁盘、IP等),实现更实用的motd功能,步骤详细,初学者可直接复制脚本。
步骤1:安装update-motd框架(openEuler默认未预装)
动态motd依赖update-motd框架,执行以下命令安装(需联网):
更新软件源(确保能正常下载安装包)
dnf update -y
安装update-motd框架
dnf install -y update-motd
步骤2:创建动态motd核心目录(安装后未自动创建则执行)
部分情况下,安装update-motd后不会自动创建脚本目录,执行以下命令创建并设置权限:
创建目录
mkdir -p /etc/update-motd.d
设置目录权限(符合安全规则)
chmod 755 /etc/update-motd.d
chown root:root /etc/update-motd.d
步骤3:创建第一个动态脚本:00-header(欢迎头部,最先显示)
该脚本用于显示欢迎信息、主机名、系统版本、当前时间,是motd的头部内容,执行以下命令创建脚本:
nano /etc/update-motd.d/00-header
写入以下内容(可直接复制,无需修改):
#!/bin/bash
00-header: motd欢迎头部脚本
获取主机名
HOSTNAME=$(hostname)
获取系统版本
OS_VERSION=(cat /etc/openEuler-latest \| grep openEulerversion \| awk -F= '{print 2}')
获取当前时间
CURRENT_TIME=$(date +"%Y年%m月%d日 %H:%M:%S %Z")
输出头部内容
echo "============================================="
echo " 欢迎来到 $HOSTNAME 服务器"
echo " 系统版本:openEuler $OS_VERSION"
echo " 当前时间:$CURRENT_TIME"
echo "============================================="
echo ""
保存退出(Ctrl+O → Enter → Ctrl+X),然后给脚本添加可执行权限(必做,否则脚本无法执行):
chmod 755 /etc/update-motd.d/00-header
chown root:root /etc/update-motd.d/00-header
步骤4:创建第二个动态脚本:10-sysinfo(系统实时信息)
该脚本用于显示系统核心实时信息,所有命令均为系统自带,无需额外安装,执行以下命令创建脚本:
nano /etc/update-motd.d/10-sysinfo
写入以下内容(可直接复制):
#!/bin/bash
10-sysinfo: 系统实时信息展示脚本
1. 内核版本
KERNEL=$(uname -r)
2. 1分钟平均负载
LOAD_1=(uptime \| awk -F'load average:' '{print 2}' | awk '{print $1}' | sed 's/,//')
3. 内存使用率
MEM_TOTAL=(free -h \| grep Mem \| awk '{print 2}')
MEM_USED=(free -h \| grep Mem \| awk '{print 3}')
MEM_USAGE=(free \| grep Mem \| awk '{printf "%.1f%%", 3/$2*100}')
4. 根磁盘使用率
DISK_TOTAL=(df -h / \| grep / \| awk '{print 2}')
DISK_USED=(df -h / \| grep / \| awk '{print 3}')
DISK_USAGE=(df -h / \| grep / \| awk '{print 5}')
5. 本机IP地址(排除127.0.0.1)
LOCAL_IP=(ip addr \| grep inet \| grep -v 127.0.0.1 \| grep -v inet6 \| awk '{print 2}' | awk -F/ '{print $1}' | xargs)
6. 当前在线用户数
ONLINE_USERS=$(who | wc -l)
输出系统信息
echo "�� 系统核心信息"
echo "---------------------------------------------"
echo " 内核版本:$KERNEL"
echo " 1分钟负载:$LOAD_1"
echo " 内存使用:MEM_USED / MEM_TOTAL ($MEM_USAGE)"
echo " 磁盘使用:DISK_USED / DISK_TOTAL ($DISK_USAGE)"
echo " 本机IP:$LOCAL_IP"
echo " 在线用户:$ONLINE_USERS 人"
echo "---------------------------------------------"
echo ""
保存退出后,添加可执行权限:
chmod 755 /etc/update-motd.d/10-sysinfo
chown root:root /etc/update-motd.d/10-sysinfo
步骤5:创建第三个动态脚本:99-footer(页脚提示,最后显示)
该脚本用于显示安全提示、运维联系方式,是motd的页脚内容,执行以下命令创建脚本:
nano /etc/update-motd.d/99-footer
写入以下内容(可修改联系方式):
#!/bin/bash
99-footer: motd页脚脚本
echo "⚠️ 安全提示:请规范操作,禁止执行未经授权的命令"
echo "�� 运维紧急联系:13xxxxxxxxx | 工作日 9:00-18:00"
echo "============================================="
echo ""
保存退出后,添加可执行权限:
chmod 755 /etc/update-motd.d/99-footer
chown root:root /etc/update-motd.d/99-footer
步骤6:手动测试脚本是否正常执行(必做,提前排查错误)
脚本创建完成后,先手动测试执行,避免登录时无内容显示,执行以下命令:
按顺序执行所有动态脚本,查看输出结果
run-parts /etc/update-motd.d/
若正常输出头部、系统信息、页脚内容,无任何报错,说明脚本正常;若有报错,根据提示修改对应脚本(通常是拼写错误、权限不足)。
步骤7:验证最终效果
重新登录系统(本地或远程),即可看到动态生成的、带实时系统信息的完整motd内容,每次登录都会更新最新的系统数据(如时间、负载)。
步骤8:禁用/恢复单个动态脚本(无需删除)
若不需要某个动态脚本(如不需要页脚),无需删除,只需去掉可执行权限即可,执行以下命令:
禁用脚本(示例:禁用99-footer页脚脚本)
chmod -x /etc/update-motd.d/99-footer
恢复脚本执行权限(重新启用)
chmod +x /etc/update-motd.d/99-footer
四、高阶用法
适合有基础的初学者进阶,实现更强大的motd能力,所有用法均适配openEuler 24.03 LTS SP3,步骤同样详细,可直接对照操作。
4.1 高阶用法一:带颜色美化的motd(突出重点信息)
利用ANSI转义码,给motd内容添加颜色、加粗、高亮等效果,让关键信息更醒目,提升可读性,以下是详细实操。
常用ANSI格式代码(直接复制使用)
|---------|------------|
| 效果 | 代码 |
| 黑色 | \033[30m |
| 红色(警告用) | \033[31m |
| 绿色(正常用) | \033[32m |
| 黄色(提醒用) | \033[33m |
| 蓝色(标题用) | \033[34m |
| 加粗 | \033[1m |
| 重置所有格式 | \033[0m |
实操示例:美化00-header脚本
修改之前创建的00-header脚本,添加颜色效果,执行以下命令:
nano /etc/update-motd.d/00-header
替换为以下带颜色的内容(可直接复制):
#!/bin/bash
带颜色美化的header脚本
HOSTNAME=$(hostname)
OS_VERSION=(cat /etc/openEuler-latest \| grep openEulerversion \| awk -F= '{print 2}')
CURRENT_TIME=$(date +"%Y年%m月%d日 %H:%M:%S %Z")
颜色定义(方便后续修改)
BLUE="\033[34m"
GREEN="\033[32m"
BOLD="\033[1m"
RESET="\033[0m"
输出带颜色的内容(echo必须加-e参数,解析ANSI转义码)
echo -e "{BLUE}============================================={RESET}"
echo -e "{BOLD}{GREEN} 欢迎来到 HOSTNAME 服务器{RESET}"
echo -e " 系统版本:openEuler $OS_VERSION"
echo -e " 当前时间:$CURRENT_TIME"
echo -e "{BLUE}============================================={RESET}"
echo ""
保存退出后,重新登录系统,即可看到蓝色边框、绿色加粗的标题美化效果,其他脚本可按此方法添加颜色。
4.2 高阶用法二:条件触发式告警motd
实现当系统出现异常(磁盘使用率过高、负载过高、内存不足)时,自动在motd中显示红色告警,正常状态显示绿色提示,无需手动查看系统状态,登录即可知晓。
实操示例:创建20-alert告警脚本
执行以下命令,创建告警脚本(数字20表示在10-sysinfo之后、30-security之前执行):
nano /etc/update-motd.d/20-alert
写入以下内容(可直接复制,阈值可修改):
#!/bin/bash
20-alert: 系统异常告警脚本
颜色定义
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
BOLD="\033[1m"
RESET="\033[0m"
1. 磁盘使用率告警(阈值80%,可修改)
DISK_USAGE_NUM=(df / \| grep / \| awk '{print 5}' | sed 's/%//g')
2. 内存使用率告警(阈值90%,可修改)
MEM_USAGE_NUM=(free \| grep Mem \| awk '{printf "%.0f", 3/$2*100}')
3. 系统负载告警(阈值=CPU核心数,自动获取)
CPU_CORES=$(nproc)
LOAD_1_NUM=(uptime \| awk -F'load average:' '{print 2}' | awk '{print 1}' \| sed 's/,//' \| awk '{printf "%.0f", 1}')
输出告警标题
echo -e "{BOLD}�� 系统状态告警{RESET}"
echo "---------------------------------------------"
磁盘状态判断
if [ $DISK_USAGE_NUM -ge 80 ]; then
echo -e " 根磁盘使用率:{RED}{BOLD}DISK_USAGE_NUM% 【严重告警,超过80%阈值】{RESET}"
else
echo -e " 根磁盘使用率:{GREEN}DISK_USAGE_NUM% 【正常】${RESET}"
fi
内存状态判断
if [ $MEM_USAGE_NUM -ge 90 ]; then
echo -e " 内存使用率:{RED}{BOLD}MEM_USAGE_NUM% 【严重告警,超过90%阈值】{RESET}"
else
echo -e " 内存使用率:{GREEN}MEM_USAGE_NUM% 【正常】${RESET}"
fi
系统负载判断
if [ LOAD_1_NUM -ge CPU_CORES ]; then
echo -e " 系统负载:{RED}{BOLD}LOAD_1_NUM 【严重告警,超过CPU核心数阈值CPU_CORES】${RESET}"
else
echo -e " 系统负载:{GREEN}LOAD_1_NUM 【正常】${RESET}"
fi
echo "---------------------------------------------"
echo ""
保存退出后,添加可执行权限:
chmod 755 /etc/update-motd.d/20-alert
chown root:root /etc/update-motd.d/20-alert
重新登录系统,即可看到系统状态的自动判断和颜色告警,异常情况会自动标红加粗提醒,可根据实际需求修改阈值(如磁盘阈值改为85%)。
4.3 高阶用法三:登录安全审计motd
展示上一次登录信息、失败登录次数,提醒用户是否有异常登录行为,提升系统安全性,适合企业服务器使用。
实操示例:创建30-security安全审计脚本
执行以下命令,创建安全审计脚本:
nano /etc/update-motd.d/30-security
写入以下内容(可直接复制):
#!/bin/bash
30-security: 登录安全审计脚本
颜色定义
RED="\033[31m"
GREEN="\033[32m"
YELLOW="\033[33m"
BOLD="\033[1m"
RESET="\033[0m"
获取当前登录用户
CURRENT_USER=$USER
上一次成功登录信息
LAST_LOGIN=(last -n 1 CURRENT_USER | grep -v wtmp | head -n 1)
失败登录次数(近100条记录)
FAILED_LOGIN=(lastb -n 100 CURRENT_USER 2>/dev/null | wc -l)
输出安全信息
echo -e "{BOLD}�� 登录安全审计{RESET}"
echo "---------------------------------------------"
echo " 当前登录用户:$CURRENT_USER"
echo " 上一次成功登录:$LAST_LOGIN"
失败登录判断
if [ $FAILED_LOGIN -gt 0 ]; then
echo -e " 历史失败登录次数:{RED}{BOLD}FAILED_LOGIN 次【请注意账号安全】{RESET}"
else
echo -e " 历史失败登录次数:{GREEN}0 次【正常】{RESET}"
fi
echo "---------------------------------------------"
echo ""
保存退出后,添加可执行权限:
chmod 755 /etc/update-motd.d/30-security
chown root:root /etc/update-motd.d/30-security
重新登录即可看到登录安全信息,若有失败登录会自动标红提醒,可及时排查账号是否被盗用。
4.4 高阶用法四:多用户差异化motd
实现不同用户登录,显示不同的motd内容:root用户显示完整运维信息,普通用户仅显示欢迎和使用规范,避免普通用户看到敏感运维信息。
实操示例:修改00-header脚本实现差异化显示
执行以下命令,修改之前的00-header脚本:
nano /etc/update-motd.d/00-header
替换为以下内容(可直接复制):
#!/bin/bash
多用户差异化header脚本
HOSTNAME=$(hostname)
OS_VERSION=(cat /etc/openEuler-latest \| grep openEulerversion \| awk -F= '{print 2}')
CURRENT_TIME=$(date +"%Y年%m月%d日 %H:%M:%S %Z")
CURRENT_USER=$USER
颜色定义
BLUE="\033[34m"
GREEN="\033[32m"
RED="\033[31m"
BOLD="\033[1m"
RESET="\033[0m"
root用户专属内容(显示警告和完整信息)
if [ $CURRENT_USER = "root" ]; then
echo -e "{BLUE}============================================={RESET}"
echo -e "{BOLD}{RED} 警告:您当前使用ROOT超级用户登录${RESET}"
echo -e "{BOLD}{RED} 请谨慎操作,所有操作将直接影响系统${RESET}"
echo -e " 主机名:$HOSTNAME"
echo -e " 系统版本:openEuler $OS_VERSION"
echo -e " 当前时间:$CURRENT_TIME"
echo -e "{BLUE}============================================={RESET}"
echo ""
普通用户内容(仅显示欢迎和使用规范)
else
echo -e "{BLUE}============================================={RESET}"
echo -e "{BOLD}{GREEN} 欢迎使用 HOSTNAME 服务器{RESET}"
echo -e " 系统版本:openEuler $OS_VERSION"
echo -e " 当前时间:$CURRENT_TIME"
echo -e "{BLUE}============================================={RESET}"
echo ""
echo "�� 使用规范:"
echo " 1. 禁止执行未经运维授权的命令"
echo " 2. 禁止泄露账号密码给无关人员"
echo " 3. 禁止在系统中存储违规数据"
echo "---------------------------------------------"
echo ""
fi
保存退出,分别用 root 用户和普通用户登录,即可看到不同的 motd 内容。
五、拓展建议
5.1 安全最佳实践(重中之重,初学者必看)
- 严格控制权限:所有 motd 相关的配置文件、脚本,必须保证所有者为 root:root,禁止给其他用户写权限。若其他用户可修改 motd 脚本,会导致登录时以 root 权限执行恶意代码,造成严重的提权安全风险;
- 禁止敏感信息泄露:不要在 motd 中写入系统内部 IP、运维接口、账号密码、业务系统地址等敏感信息,防止登录界面泄露核心数据;
- 禁止高风险命令:不要在 motd 脚本中执行 rm、chmod -R、systemctl stop 关键服务等高风险命令,避免脚本执行异常导致系统故障;
- 脚本容错处理 :进阶脚本建议添加
set -e参数,或对关键命令做异常判断,避免脚本执行失败导致登录卡顿; - 适配 SELinux :openEuler 默认启用 SELinux,若脚本执行异常,可通过
journalctl -xe查看 SELinux 拦截日志,不要直接关闭 SELinux,而是通过chcon调整上下文权限。
5.2 性能优化建议
- 控制脚本执行耗时 :motd 脚本在用户登录时同步执行,若脚本中有耗时操作(大文件扫描、无超时的网络请求),会导致用户登录卡顿。建议:
- 网络请求添加超时时间,如
curl --connect-timeout 2; - 避免执行复杂的磁盘遍历、日志分析命令;
- 单脚本执行时间控制在 1 秒内完成。
- 网络请求添加超时时间,如
- 精简内容:motd 内容不宜过长,避免刷屏,只展示核心的公告、告警、关键系统信息;
- 禁用无用脚本:不需要的动态脚本,直接去掉可执行权限,减少登录时的执行开销。
5.3 常见问题排错指南(初学者踩坑必看)
| 常见问题 | 核心原因 | 排查解决步骤 |
|---|---|---|
| 配置了 motd,登录不显示 | 1. SSH 的 PrintMotd 和 PAM 同时关闭;2. 脚本无执行权限;3. 脚本语法错误;4. PAM 配置被修改 | 1. 检查 /etc/ssh/sshd_config 的 PrintMotd,建议设为 no;2. 检查 /etc/pam.d/sshd 和 login 中是否有 pam_motd.so 配置;3. 给脚本添加 755 权限,确认所有者为 root;4. 手动执行 run-parts /etc/update-motd.d/ 看是否有报错 |
| motd 内容重复显示两次 | SSH 服务和 PAM 同时开启了 motd 打印 | 编辑 /etc/ssh/sshd_config,设置 PrintMotd no,重启 sshd 服务即可 |
| 动态脚本不执行,无内容输出 | 1. 脚本无执行权限;2. 脚本无 shebang 行;3. 脚本有语法错误;4. 权限不符合安全要求 | 1. 执行 chmod 755 给脚本添加执行权限;2. 检查脚本开头是否有 #!/bin/bash;3. 手动执行 bash -x 脚本名,调试语法错误;4. 确认脚本所有者为 root:root,其他用户无写权限 |
| 登录时卡顿,很久才进入命令行 | motd 脚本中有耗时操作,或网络请求超时 | 1. 检查脚本中的 curl、wget 等网络命令,添加超时参数;2. 去掉复杂的遍历、查询命令;3. 逐个禁用脚本,定位卡顿的脚本 |
| 脚本手动执行正常,登录时不显示 | 1. 脚本中使用了相对路径,登录时环境变量不一致;2. 命令不存在,登录时 PATH 环境变量不全 | 1. 脚本中所有命令使用绝对路径,如 /usr/bin/df;2. 脚本开头添加 PATH 环境变量声明:export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin |
5.4 进阶学习方向
- Shell 脚本进阶:学习 Shell 脚本编写,优化 motd 脚本,实现对接监控系统、自动拉取企业公告、工单提醒等复杂逻辑;
- PAM 模块深入学习:了解 PAM 认证机制,掌握 pam_motd 模块的高级参数,实现更灵活的 motd 显示控制;
- 批量运维管理:结合 Ansible 等自动化运维工具,批量管理数百台 openEuler 服务器的 motd 配置,统一推送公告、更新脚本;
- 整合监控系统:对接 Prometheus、Zabbix 等监控系统,将监控告警信息实时推送到 motd 中,登录即可看到业务系统告警;
- 合规审计适配:根据等保 2.0、行业合规要求,在 motd 中添加授权声明、审计提示、合规规范等内容,满足监管要求。