linux command

回想在電算中心的第一天

那天早晨,我握著剛領到的識別證,掌心還殘留微微汗意。穿過圖資大樓長長的走廊,我跟在學長後頭,走進了神秘的電算中心的門口,印入眼簾的是伺服器機架低沈風扇聲,讓我的心臟跟著噗通噗通。這是我第一次正式踏進學校的電算中心,也是我夢想成為系統管理員的起點。


帳號到底有多少?

學長(轉頭,語氣平穩卻藏著期待):

如果你是系統,會把「所有帳號」存在哪?檔案?資料庫?還是雲端?

:應該是文字檔?

學長:很好,來驗證

Bash
cat /etc/passwd | cut -d: -f1
# 或
getent passwd | cut -d: -f1

看見那一長串帳號時,我突然有種「闖入祕密名冊」的暢快,卻也擔心自己讀不懂裡面每一個陌生名字。

忽然的提問

  • 真正能登入的帳號有哪幾個?
  • 試找找看哪些使用 /usr/sbin/nologin 作為 shell。

歷史足跡的挖掘,他們上次什麼時候登入?

突然,值班螢幕顯示「帳密嘗試失敗」的警告燈號。我心中一緊,學長眼神也銳利起來,示意我別慌。

學長:想找出誰剛剛嘗試登入?試試看last 。

Bash
last -F | head

last -F james

我照做,螢幕上浮現一連串時間戳;那一刻我體會到日誌不只冷冰冰,它們其實在說故事──登入的故事

再追

  • 若想挖出「從未登入」的帳號?
Bash
sudo lastlog | grep 'Never logged in'

見到好些帳號竟從來沒用過,我心底有股說不出的不安,像是走進空教室卻看見亮著的投影機。


即時監控的刺激

  • who
  • w
  • users

學長反問

這三個指令都讀 /var/run/utmp,為何輸出長得不一樣?

我邊回答邊感覺自己像在偵探小說裡 抽絲剝繭,每一行紀錄都可能是一條證據。


Linux 帳號安全的小道具

目的指令用法重點
查看群組/UIDid jamesgroups james確認權限範圍
檢查密碼過期chage -l james察看密碼輪替
登入失敗統計faillog -u james配合 /var/log/faillog
SSH 連線紀錄journalctl -u ssh.service -S todaysystemd 系統

faillog 跳出多次嘗試失敗的數字,我背脊微涼。學長拍拍我肩:

「別怕,數據先讓我們看到危險,剩下的就是行動。」


打造每日警報腳本

主任突然要求「明天起寄送每日登入報表」。時限只剩半天,整個機房氣氛緊繃。我深吸一口氣,決定動手。

腳本

Bash
#!/usr/bin/env bash
set -eu  # 非必要,但能提早發現錯誤

TODAY=$(date +'%F')                      # 2025-05-10
HOST=$(hostname -s)                      # 短主機名
REPORT="/tmp/${HOST}-login-report-${TODAY}.txt"

# 確保備份目錄存在
install -d -o root -g root -m 0755 /var/backups

{
  echo "=== ${TODAY} ${HOST} 登入紀錄 ==="
  last -F -w | head -n 50 || echo "(last 指令執行失敗)"

  echo
  echo "=== 失敗登入嘗試 ==="
  sudo faillog -a || echo "(faillog 未取得輸出,可能不是 root)"

  echo
  echo "=== 新增 / 刪除帳號差異 ==="
  if [[ -f /var/backups/passwd.prev ]]; then
    diff -u /var/backups/passwd.prev /etc/passwd || true
  else
    echo "(首次執行,無 baseline)"
  fi
} > "$REPORT"

cp /etc/passwd /var/backups/passwd.prev

# 郵件發送
if command -v mail >/dev/null 2>&1; then
  mail -s "[Daily] Login & Account Report (${HOST})" sysadmin@example.edu < "$REPORT"
else
  echo "⚠️  系統未安裝 mailx,無法寄送報表" >> "$REPORT"
fi

並在 cron 內排程:

Bash
0 7 * * * /usr/local/sbin/daily_login_report.sh

當測試郵件成功寄出,我胸口一陣暖流!那是「解決問題」的實感


那一天的收穫

  1. 帳號名冊/etc/passwd + getent passwd
  2. 歷史行蹤lastlastlog
  3. 即時上線whowusers
  4. 安全檢查chagefaillogjournalctl
  5. 自動通知:Shell 腳本 + cron + mailx

學長臨別提問

  • 萬一學校改用 LDAP,這份腳本該怎麼適應?
  • 如果資安政策要求「90 天強制改密碼」,你會在腳本裡加什麼檢查邏輯?

我在心裡回答:等下一班值勤時,我就要動手升級它。

走出機房,晚風掠過,我忽然恍悟,原來管理帳號,就像守護入口的觀者者:看得見過往、掌握現在,還得預防未來。