1. 项目概述:openEuler 24.03 LTS SP3的motd标志区功能
motd(Message of the Day)是Linux系统中一个经典的功能,它会在用户登录时显示系统消息。在openEuler 24.03 LTS SP3这个长期支持版本的第三个服务包中,motd功能得到了显著增强,特别是其标志区(Banner Area)的自定义能力。
作为一款企业级操作系统,openEuler对motd的处理方式与常规Linux发行版有所不同。它通过/etc/motd文件与动态生成内容的结合,为系统管理员提供了更灵活的消息展示方式。这个功能在企业环境中特别实用,可以用于:
- 显示系统维护通知
- 展示合规性声明
- 提供重要系统信息
- 自定义企业欢迎信息
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. motd标志区配置详解
2.1 基础配置文件位置
openEuler的motd系统主要涉及以下几个关键文件:
code复制/etc/motd - 静态消息文件
/etc/update-motd.d/ - 动态消息脚本目录
/run/motd.dynamic - 动态生成的消息缓存
与Ubuntu等发行版不同,openEuler采用了一种混合模式,既支持传统的静态motd,也支持动态内容生成。
2.2 标志区定制方法
要自定义标志区内容,我们可以通过以下三种方式:
- 直接编辑静态文件:
bash复制sudo vim /etc/motd
这种方式最简单,但内容固定不变。
- 使用动态生成脚本:
bash复制sudo mkdir -p /etc/update-motd.d/
sudo chmod 755 /etc/update-motd.d/
创建一个示例脚本:
bash复制sudo tee /etc/update-motd.d/10-system-info <<'EOF'
#!/bin/bash
echo "===== 系统信息 ====="
echo "主机名: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "当前时间: $(date)"
echo "运行时间: $(uptime -p)"
EOF
sudo chmod +x /etc/update-motd.d/10-system-info
- 使用PAM模块:
openEuler还支持通过pam_motd模块动态生成内容,相关配置在:
code复制/etc/pam.d/sshd
/etc/pam.d/login
3. 高级定制技巧
3.1 添加ASCII艺术标志
要让登录界面更醒目,可以添加ASCII艺术字:
bash复制sudo tee -a /etc/motd <<'EOF'
___ ____ _ _ _____ _ _ _____
/ _ \| _ \| | | | ____| | | | ____|
| | | | |_) | |_| | _| | |_| | _|
| |_| | __/| _ | |___| _ | |___
\___/|_| |_| |_|_____|_| |_|_____|
EOF
3.2 添加系统状态信息
创建一个动态脚本显示系统状态:
bash复制sudo tee /etc/update-motd.d/20-system-status <<'EOF'
#!/bin/bash
printf "\n当前系统状态:\n"
printf "CPU使用率: %s\n" "$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')%"
printf "内存使用: %s/%sMB\n" "$(free -m | awk '/Mem:/ {print $3}')" "$(free -m | awk '/Mem:/ {print $2}')"
printf "磁盘空间:\n%s\n" "$(df -h | grep -v tmpfs)"
EOF
sudo chmod +x /etc/update-motd.d/20-system-status
3.3 使用颜色和格式
虽然大多数SSH客户端不支持ANSI颜色,但可以通过转义序列实现基本格式:
bash复制sudo tee /etc/update-motd.d/30-warning <<'EOF'
#!/bin/bash
echo -e "\033[1;31m重要通知:\033[0m"
echo -e "系统将于本周末进行维护,请提前保存工作!"
EOF
4. 实际应用案例
4.1 企业合规声明
对于需要合规审计的企业环境,可以在motd中加入法律声明:
bash复制sudo tee /etc/update-motd.d/40-compliance <<'EOF'
#!/bin/bash
echo "=== 合规声明 ==="
echo "此系统仅限授权用户使用。所有活动将被记录和监控。"
echo "未经授权访问将受到法律追究。"
date +"声明更新时间: %Y-%m-%d %H:%M:%S"
EOF
4.2 多节点集群信息
在集群环境中,可以显示节点特定信息:
bash复制sudo tee /etc/update-motd.d/50-cluster-info <<'EOF'
#!/bin/bash
echo "=== 集群信息 ==="
echo "节点角色: $(cat /etc/node-role 2>/dev/null || echo "普通节点")"
echo "所属集群: $(cat /etc/cluster-name 2>/dev/null || echo "未配置")"
EOF
5. 常见问题解决
5.1 motd不显示问题排查
如果motd没有按预期显示,可以按照以下步骤排查:
- 检查PAM配置:
bash复制grep motd /etc/pam.d/sshd
应该包含类似:
code复制session optional pam_motd.so
- 检查脚本权限:
bash复制ls -l /etc/update-motd.d/
所有脚本应为可执行状态(755权限)。
- 测试动态生成:
bash复制run-parts /etc/update-motd.d/
5.2 性能优化建议
当/etc/update-motd.d/中的脚本过多或过于复杂时,可能导致登录延迟。建议:
- 限制脚本执行时间:
bash复制sudo tee /etc/update-motd.d/99-timeout <<'EOF'
#!/bin/bash
# 设置超时5秒
timeout 5s your_script.sh
EOF
- 缓存结果:
bash复制sudo tee /etc/update-motd.d/60-cached-info <<'EOF'
#!/bin/bash
CACHE_FILE="/var/cache/motd-info.cache"
MAX_AGE=3600 # 1小时
if [ -f "$CACHE_FILE" ]; then
file_age=$(($(date +%s) - $(stat -c %Y "$CACHE_FILE")))
if [ "$file_age" -lt "$MAX_AGE" ]; then
cat "$CACHE_FILE"
exit 0
fi
fi
# 生成新内容并缓存
{
echo "=== 缓存信息 ==="
echo "生成时间: $(date)"
# 其他信息收集命令...
} > "$CACHE_FILE"
cat "$CACHE_FILE"
EOF
6. 安全注意事项
-
信息泄露风险:
避免在motd中显示敏感信息,如内部IP、系统漏洞详情等。 -
脚本安全:
确保/etc/update-motd.d/中的脚本:
- 属root所有
- 其他用户不可写
- 不包含危险命令
检查命令:
bash复制sudo find /etc/update-motd.d/ -type f -perm -o+w -ls
- 合规要求:
某些行业规范(如等保)要求必须显示登录警告,可通过motd实现:
bash复制sudo tee /etc/motd <<'EOF'
警告:您正在访问XXX公司授权系统,所有操作将被记录审计。
EOF
7. 进阶:集成其他系统信息
7.1 显示安全更新状态
bash复制sudo tee /etc/update-motd.d/70-security-updates <<'EOF'
#!/bin/bash
echo "=== 安全更新 ==="
if [ -x /usr/bin/dnf ]; then
dnf updateinfo list sec | grep -c "^"
elif [ -x /usr/bin/yum ]; then
yum updateinfo list sec | grep -c "^"
else
echo "无法检查更新"
fi
echo "个安全更新待安装"
EOF
7.2 显示最近登录
bash复制sudo tee /etc/update-motd.d/80-last-login <<'EOF'
#!/bin/bash
echo "=== 最近登录 ==="
last -5 -i
EOF
7.3 天气信息集成(需网络)
bash复制sudo tee /etc/update-motd.d/90-weather <<'EOF'
#!/bin/bash
echo "=== 当地天气 ==="
curl -s "wttr.in?format=3"
EOF
