Skip to content
View in the app

A better way to browse. Learn more.

PHP论坛人

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SSH MOTD 監控面板 Part 1

Featured Replies

適用環境

作業系統:Debian 13

VPS規格:2 vCPU / 2GB RAM

應用情境:LNMP 論壇網站

防火牆:匹配 nftables 防火牆




----------
前言
----------

為什麼需要動態 MOTD?

MOTD (Message of the Day) 是使用者透過 SSH 登入系統時顯示的訊息。對於維運人員,一個即時、動態的 MOTD 面板能讓你:


快速掌握健康狀態:CPU 負載、記憶體、磁碟、Inode 使用率一目了然

主動監控服務:即時顯示 Nginx、PHP-FPM、MariaDB、Redis、Fail2ban 的運作狀態,異常即告警

及早發現資安威脅:觀察 Fail2ban 封鎖數、SYN Flood 跡象、防火牆阻擋封包數

分析即時流量:查看即時 QPS、熱門 URL、來自哪些國家/IP 的請求

掌握論壇營運:顯示線上人數、資料庫慢查詢總數、快取命中率




2GB VPS 的特殊考量:記憶體資源有限,任何記憶體洩漏或磁碟爆滿都可能在短時間內導致服務中斷。動態 MOTD 讓你在問題影響使用者前就能提早察覺




--------------------
MOTD的運作機制
--------------------

Linux 系統中的MOTD分為兩種類型:


靜態MOTD
/etc/motd
純文字檔,內容固定不變


動態MOTD
/etc/update-motd.d/
由腳本動態產生,每次登入時即時執行


注意:在Debian 13中,若同時存在靜態與動態MOTD,兩者的內容都會顯示

若只想顯示動態內容,建議將 /etc/motd 的內容清空







---------------------
腳本用途與背景
---------------------

什麼是 update-motd.d?

Linux系統在使用者透過SSH登入時,會自動執行 /etc/update-motd.d/ 目錄下所有可執行的腳本,並將輸出顯示為「每日訊息」 (Message of the Day,MOTD)

這套機制讓管理員在登入的瞬間就能掌握伺服器現況,無需手動執行 top、df、ss 等指令



--------------------
腳本命名規則
--------------------

目錄內的腳本以數字開頭,系統會依序執行:

/etc/update-motd.d/
  00-header          ← 最先執行(通常是歡迎訊息)
  10-system-info     ← 本教學的腳本位置
  90-updates         ← 較晚執行

數字越小優先執行。10-system-info 是常見慣例,代表「基礎系統資訊」


--------------------------
架構設計:快取機制
--------------------------

本教學採用 "快取機制",架構如下


Cron(每 5 分鐘)
    └─→ /usr/local/bin/motd-update.sh(收集系統資料)
              └─→ /var/cache/motd/stats(快取檔)

SSH 登入
    └─→ /etc/update-motd.d/10-system-info(讀取快取,即時渲染)



為什麼需要快取?

直接在每次登入時執行所有偵測指令,將造成:

SSH 登入緩慢(等待 apt list --upgradable、fail2ban-client 等耗時指令)

多人同時登入時,同時對 MariaDB、Redis 發出查詢,產生不必要的系統負擔


快取機制讓顯示腳本幾乎瞬間完成;少數需要即時性的資料(IPv6 位址、論壇在線人數、日誌分析)才在登入時即時取得






-----------------------
安裝必要套件
-----------------------


更新系統
apt update && apt upgrade -y



基礎工具 (通常已內建)
apt install -y procps util-linux iproute2 coreutils


確認以下工具可用
which hostname free df ss nproc uname uptime vmstat



Fail2ban (防暴力破解)
apt install -y fail2ban


sysstat (提供 iostat,用於磁碟 IO 統計)
apt install -y sysstat


MaxMind GeoLite2 官方更新工具
apt install -y geoipupdate mmdb-bin



Redis 客戶端工具
apt install -y redis-tools



bc (用於浮點數計算)
apt install -y bc




啟用 sysstat 資料收集 (磁碟 IO 統計),Debian預設未啟用

修改設定

sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat





確認生效,預期輸出:ENABLED="true"
grep ENABLED /etc/default/sysstat



常見遺漏:忘記啟用 sysstat 導致 iostat 無法收集歷史資料,MOTD的磁碟IO區塊會顯示空白




------------------
啟用服務
------------------


systemctl enable --now sysstat



systemctl enable --now fail2ban



systemctl enable --now geoipupdate.timer


說明:geoipupdate.timer 是 systemd timer 單元,負責定期自動更新 GeoLite2 地理位置資料庫

geoipupdate.service 由 timer 驅動,通常不需要手動 enable



---------------------------
驗證服務狀態
---------------------------


確認 sysstat 正在運行,預期看到 active (exited)
systemctl status sysstat



確認 fail2ban 正在運行
systemctl status fail2ban



確認 geoipupdate.timer 正在運行
systemctl status geoipupdate.timer





測試 sysstat 資料收集 (應顯示 CPU 使用率)
sar -u 1 3




確認日誌目錄已產生資料檔 (檔名數字為日期,例如,今天是 23日則為 sa23)
ls /var/log/sysstat/






---------------------
靜態MOTD
---------------------


靜態 MOTD 適合顯示固定的安全警告或伺服器識別資訊。若只想顯示動態內容,建議清空內容


編輯
vi /etc/motd



建議將內容刪除




儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter



-------------------------------
為什麼不刪除 /etc/motd?
-------------------------------

部分 PAM 模組會嘗試讀取此檔案,若不存在可能產生警告。保留空白檔案是最安全的做法




測試結果,先SSH登出
exit



再次SSH登入,應可看到已刪除靜態MOTD的情況





--------------------
停用預設的腳本
--------------------


Debian 13 已有預設腳本 10-uname,若不需要可移除執行權限

chmod -x /etc/update-motd.d/10-uname 2>/dev/null || true




使用 || true 確保即使檔案不存在也不會讓腳本因 set -e 而中斷

---------------------------------

建立 10-system-info 腳本

---------------------------------

建立腳本

vi /etc/update-motd.d/10-system-info

10-system-info.txt

貼上以下內容 (注意:第1行不能為空白)

請根據你的實際環境,修改以下設定變數

# 論壇資料庫設定(Invision Community 5.0)

FORUM_DB="xxxx_com" # 請修改為你的資料庫名稱

FORUM_TABLE_PREFIX="" # 資料表前綴(通常為空)

# Nginx 日誌路徑

NGINX_LOG="/var/log/nginx/xxxxxx.com.access.log" # 請修改為你的實際路徑

儲存檔案並離開vi編輯器

按 Esc,輸入 :wq,按 Enter

-----------------
賦予執行權限
-----------------


賦予執行權限
chmod 700 /etc/update-motd.d/10-system-info


chown root:root /etc/update-motd.d/10-system-info



說明:700 表示僅 root 可讀寫執行。由於此腳本可能包含資料庫名稱等敏感資訊,不應讓一般使用者讀取

-----------------------

快取更新的腳本

-----------------------

編輯

vi /usr/local/bin/motd-update.sh

motd-update.sh

貼上以下內容

儲存檔案並離開vi編輯器

按 Esc,輸入 :wq,按 Enter


-------------------------------
給予執行權限
-------------------------------

給予執行權限
chmod +x /usr/local/bin/motd-update.sh


chown root:root /usr/local/bin/motd-update.sh








--------------------
Cron 排程設定
--------------------


啟用
systemctl enable cron


啟動
systemctl start cron




檢查狀態,確認已運行 active (running)
systemctl status cron



開啟 crontab 編輯器
crontab -e


將顯示訊息
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano        <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny

我慣用vi,選擇 2




在未尾加入以下內容



# SSH MOTD 快取更新(每5分鐘執行一次)
*/5 * * * * /usr/local/bin/motd-update.sh > /dev/null 2>&1






儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter




為什麼加 > /dev/null 2>&1?

同時壓制 stdout 與 stderr,避免 Cron 嘗試寄送郵件通知

在未設定 mail relay 的 VPS 上,大量郵件積壓會導致 /var/spool/mail 磁碟使用率緩慢增長







----------------------------
手動執行並驗證快取
----------------------------


手動產生快取
/usr/local/bin/motd-update.sh


檢查快取內容
cat /var/cache/motd/stats



預期輸出
# MOTD Cache - 更新於 2026-05-19T17:12:45+08:00
HOST=xxxxxxxx
IP=47.x.x.x
OS=Debian GNU/Linux 13 (trixie)
KERNEL=6.12.88+deb13-cloud-amd64
UPTIME=30 minutes
CPU=2
LOAD=0.02 0.02 0.02
LOAD_PCT=1.0
IOWAIT=0






------------------
確認PAM設定
------------------

Debian使用PAM控制MOTD顯示,確保以下設定存在且未被註解


編輯
vi /etc/pam.d/sshd


找到以下這2行,確保未被註解 (無 # 符號)


session    optional     pam_motd.so  motd=/run/motd.dynamic
session    optional     pam_motd.so noupdate





儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter



未修改並離開vi編輯器
按 Esc,輸入 :q,按 Enter






-------------------------
調整 SSH 主設定檔
-------------------------


編輯
vi /etc/ssh/sshd_config



找到並調整以下設定 (移除 # 註解並修改值)




# 停用 GSSAPI 驗證(若不使用 Kerberos,停用可減少認證等待時間)
#GSSAPIAuthentication no 去掉開頭 # 註解
GSSAPIAuthentication no


# 啟用 MOTD 顯示
# 將 PrintMotd no 改 yes
PrintMotd yes


# 顯示上次登入資訊
#PrintLastLog yes 去掉開頭 # 註解
PrintLastLog yes


# 停用 DNS 反向查詢(加快SSH連線速度)
# UseDNS no 去掉開頭 # 註解
UseDNS no






儲存檔案並離開vi編輯器
按 Esc,輸入 :wq,按 Enter




------------------
驗證
------------------


驗證語法,無輸出,表示語法正確
sshd -t




確認關鍵設定值
sshd -T | grep -E "(printmotd|printlastlog|usedns|gssapiauthentication)"


預期輸出
gssapiauthentication no
printmotd yes
printlastlog yes
usedns no




重啟SSH服務
systemctl restart sshd





----------------------------
驗證與首次測試
----------------------------


清除舊的動態 MOTD 快取
rm -f /var/run/motd.dynamic




重新執行所有 MOTD 腳本
run-parts /etc/update-motd.d/ > /var/run/motd.dynamic



直接執行腳本,確認輸出
bash /etc/update-motd.d/10-system-info






-----------------------
驗證SSH登入效果
-----------------------


登出
exit



重新SSH登入,確認動態MOTD正常顯示

------------------------

前往 Part 2

------------------------

SSH MOTD 監控面板 Part 2

Edited by Jack

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.