[Raspberry Pi] 建立動態MOTD

Introduction to MOTD

在Unix-like系統中,會使用/etc/motd來發布「今日消息」(message of the day),當使用者在本地或遠端登入系統時,可以顯示系統管理員向使用者發送的訊息;但是原始的motd只能使用純文本(plain text)的方式呈現,所能傳遞的資訊相對有限。

在Debian與Ubuntu的系統中可以利用多個shell script的組合來建立「動態」的motd,讓管理員可以更方便的發送資訊;動態motd可以依照需求分成header、logo、message、footer等多個shell script,header放系統的標題資訊,logo用ASCII繪製系統、公司、或者其他logo,message放給使用者的動態資訊,footer放其他的頁尾資訊,管理者可以隨時更換這些部分,來組合成一個完整、合適的motd。

下圖是由一個shell script檔建立的motd,左方顯示了一個彩色的Raspberry Pi logo,右方是利用shell script取得的動態資訊,如日期、kernel版本、OS版本、系統啟用時間、記憶體使用率、CPU負載率、執行中的程序數量等資訊。
2020-04-21_101211.png-建立動態MOTD

Build Dynamic MOTD

本篇使用的硬體為Raspberry Pi 3B+,映像檔版本為2018-11-13-raspbian-stretch-lite;以下的步驟也在其他armv7與一般PC的Debian系統中,順利的建立動態MOTD。
  1. 建立/usr/sbin/update-motd檔。
    #!/bin/sh
    #
    #    update-motd - update the dynamic MOTD immediately
    #
    #    Copyright (C) 2008-2014 Dustin Kirkland <dustin .kirkland="" gmail.com="">
    #
    #    Authors: Dustin Kirkland <dustin .kirkland="" gmail.com="">
    #    [ comments edited out by ownyourbits ]
    set -e
     
    if ! touch /var/run/motd.new 2>/dev/null; then
            echo "ERROR: Permission denied, try:" 1>&2
            echo "  sudo $0" 1>&2
            exit 1
    fi
     
    if run-parts --lsbsysinit /etc/update-motd.d > /var/run/motd.new; then
            if mv -f /var/run/motd.new /var/run/motd; then
                    cat /var/run/motd
                    exit 0
            else
                    echo "ERROR: could not install new MOTD" 1>&2
                    exit 1
            fi
    fi
    echo "ERROR: could not generate new MOTD" 1>&2
    exit 2
    並修改update-motd權限為755。
    chmod 755 /usr/sbin/update-motd
  2. 確認/etc/pam.d/sshd中有以下內容。
    session    optional     pam_motd.so  motd=/run/motd.dynamic
    以及/etc/init.d/motd中有以下內容。
    uname -snrvm > /var/run/motd.dynamic
  3. 關閉motd service,避免自動產生純文本motd檔。
    sudo systemctl disable motd
    移除原始純文本的motd檔。
    rm -f /etc/motd
    建立動態motd的symbolic link取代純文本motd。
    ln -s /var/run/motd /etc/motd
  4. 建立存放動態motd shell script的資料夾。
    mkdir /etc/update-motd.d
    再把動態motd shell script放到/etc/update-motd.d,並修改權限為755。 使用00-99作為shell script檔的前綴,例如00-header、10-logo、20-message、99-footer,如此可確保shell script的執行順序。
  5. 重新登入系統,就可以看到新的動態motd了

Debug

以下為我過去遇到的問題,以及其解決方式,若有遇到相同的問題可以嘗試看看以下的方法。
  1. 如果無法讀取畫面,可以執行/usr/sbin/update-motd查詢失敗訊息,若為「ERROR: could not generate new MOTD」可能是登入畫面檔案中語法有錯誤。
    可以手動執行/etc/update-motd.d中的shell script測試。
  2. 如果在登入時重複出現兩次motd的訊息,將/etc/pam.d/sshd中的session optional pam_motd.so noupdate註解掉。

留言