如何在 Linux 中自定义登录欢迎信息(MOTD)

12

在 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 容器信息和资源占用情况。你可以根据自己的需求进一步扩展和优化脚本。

希望这篇教程对你有帮助!如果有任何问题或建议,欢迎在评论区留言。