如何在 Linux 中自定义登录欢迎信息(MOTD)
在 Linux 系统中,每次用户登录时都会显示一个欢迎信息,称为 MOTD(Message of the Day)。默认情况下,MOTD 可能只包含一些基本的系统信息,但我们可以通过编辑 /etc/update-motd.d/
目录中的脚本来自定义这些信息,使其显示更丰富的系统状态、Docker 容器信息、资源占用情况等。
本文将教你如何通过编辑 /etc/update-motd.d/
文件来实现自定义登录欢迎信息。
1. MOTD 是什么?
MOTD 是用户登录系统时显示的消息,通常包含系统信息、欢迎语或其他重要通知。在 Debian/Ubuntu 系统中,MOTD 是通过 /etc/update-motd.d/
目录下的脚本动态生成的。
2. 准备工作
在开始之前,请确保你具有 root 权限,因为我们需要编辑系统文件。
2.1 检查 /etc/update-motd.d/
目录
运行以下命令,查看 /etc/update-motd.d/
目录中的文件:
ls /etc/update-motd.d/
你会看到一些以数字开头的脚本文件,这些文件按顺序执行,生成 MOTD。
2.2 备份现有文件
在修改之前,建议备份现有的 MOTD 脚本:
sudo cp -r /etc/update-motd.d/ /etc/update-motd.d-backup
3. 创建自定义 MOTD 脚本
我们将创建一个新的脚本文件,用于显示系统信息、Docker 容器状态和资源占用情况。
3.1 创建脚本文件
使用以下命令创建一个新的脚本文件:
sudo nano /etc/update-motd.d/99-custom-info
3.2 编写脚本内容
将以下内容粘贴到文件中:
#!/bin/bash
# 定义颜色代码
COLOR_RESET="\033[0m"
COLOR_WHITE="\033[0;37m"
COLOR_RED="\033[0;31m"
COLOR_CYAN="\033[0;36m"
COLOR_YELLOW="\033[1;33m"
echo # 空行分隔
# 获取根分区磁盘空间
if mountpoint -q /; then
DISK_USAGE=$(df -h / | awk 'NR==2 {print $4}')
else
DISK_USAGE="不可用"
fi
# 获取内存(兼容不同版本的free命令)
MEM_FREE=$(free -m | awk '/Mem:/ {print $7 " MB"}')
# 获取CPU负载(精确提取三个值)
CPU_LOAD=$(uptime | sed -E 's/.*load average: ([0-9.]+), ([0-9.]+), ([0-9.]+).*/\1, \2, \3/')
# 获取系统运行时间(支持秒数显示)
boot_time=$(date -d "$(uptime -s)" +%s)
current_time=$(date +%s)
uptime_seconds=$((current_time - boot_time))
days=$((uptime_seconds / 86400))
remaining_seconds=$((uptime_seconds % 86400))
hours=$((remaining_seconds / 3600))
remaining_seconds=$((remaining_seconds % 3600))
minutes=$((remaining_seconds / 60))
seconds=$((remaining_seconds % 60))
formatted_uptime=""
if [ $days -gt 0 ]; then
formatted_uptime+="${days}天"
fi
if [ $hours -gt 0 ]; then
formatted_uptime+="${hours}小时"
fi
if [ $minutes -gt 0 ]; then
formatted_uptime+="${minutes}分钟"
fi
if [ $seconds -gt 0 ]; then
formatted_uptime+="${seconds}秒"
fi
# 输出系统信息
echo -e "可用系统空间: ${COLOR_WHITE}${DISK_USAGE}${COLOR_RESET}"
echo -e "可用内存: ${COLOR_WHITE}${MEM_FREE}${COLOR_RESET}"
echo -e "CPU 平均负载: ${COLOR_WHITE}${CPU_LOAD}${COLOR_RESET}"
echo -e "系统运行时间: ${COLOR_WHITE}${formatted_uptime}${COLOR_RESET}"
# 获取主机IP和网关
HOST_IP=$(hostname -I | awk '{print $1}')
GATEWAY_IP=$(ip route | grep default | awk '{print $3}')
echo -e "主机IP: ${COLOR_WHITE}${HOST_IP}${COLOR_RESET}"
echo -e "网关IP: ${COLOR_WHITE}${GATEWAY_IP}${COLOR_RESET}"
# 检查正在运行的 Docker 容器
if command -v docker &> /dev/null; then
running_containers=$(docker ps --format "{{.Names}}" 2>/dev/null)
if [ -n "$running_containers" ]; then
echo -e "正在运行的 Docker 容器: ${COLOR_CYAN}"
echo "$running_containers" | sed 's/^/ /' # 缩进显示容器名称
echo -e "${COLOR_RESET}"
else
echo -e "正在运行的 Docker 容器: ${COLOR_CYAN}无${COLOR_RESET}"
fi
else
echo -e "Docker: ${COLOR_CYAN}未安装${COLOR_RESET}"
fi
# 显示 top 前三进程
echo -e "${COLOR_YELLOW}占用资源最多的进程:${COLOR_RESET}"
top -bn1 | awk 'NR>7 && NR<=10 {print $1, $2, $9, $10, $12}' | while read -r line; do
echo -e " ${COLOR_WHITE}${line}${COLOR_RESET}"
done
# 获取最近的登录失败的IP地址
echo -e "${COLOR_RED}最近登录失败的IP地址:${COLOR_RESET}"
grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | while read -r line; do
echo -e " ${COLOR_WHITE}${line}${COLOR_RESET}"
done
echo # 空行分隔
3.3 赋予脚本执行权限
保存文件后,赋予脚本执行权限:
sudo chmod +x /etc/update-motd.d/99-custom-info
4. 测试脚本
4.1 手动运行脚本
运行以下命令,测试脚本输出:
run-parts /etc/update-motd.d/
4.2 示例输出
如果一切正常,你会看到类似以下的输出:
可用系统空间: 105G
可用内存: 5265 MB
CPU 平均负载: 0.03, 0.06, 0.01
系统运行时间: 3 周, 6 天, 7 小时
正在运行的 Docker 容器:
container1
container2
container3
占用资源最多的进程:
PID 用户 CPU% MEM% 命令
1234 root 5.2 2.1 python3
5678 user 3.8 1.5 bash
9101 user 2.1 0.8 sshd
5. 登录时自动显示
脚本配置完成后,每次用户登录时,系统会自动执行 /etc/update-motd.d/
目录下的脚本,并显示自定义的欢迎信息。
6. 高级功能
6.1 添加 ASCII 字符画
你可以在脚本开头添加 ASCII 字符画,使欢迎信息更美观。例如:
echo -e "${COLOR_CYAN}"
cat << "EOF"
_____ _ _
| __ \ | | (_)
| | | | _ __ | | __ _
| | | | | '_ \ | |/ / | |
| |__| | | | | || < | |
|_____/ |_| |_||_|\_\ _|_|
EOF
echo -e "${COLOR_RESET}"
6.2 显示更多系统信息
你可以根据需要扩展脚本,显示更多系统信息,如网络状态、登录用户等。
7. 总结
通过编辑 /etc/update-motd.d/
目录中的脚本,你可以轻松自定义 Linux 系统的登录欢迎信息。本文提供的脚本示例展示了如何显示系统状态、Docker 容器信息和资源占用情况。你可以根据自己的需求进一步扩展和优化脚本。
希望这篇教程对你有帮助!如果有任何问题或建议,欢迎在评论区留言。