我們可以利用 Linux 的 **PAM (Pluggable Authentication Modules)** 模組,在每次使用者登入成功時觸發腳本。
### 第一步:準備 Telegram Bot
1. 在 Telegram 搜尋 `@BotFather` 並建立一個機器人,取得 **API Token**。
2. 傳訊息給你的機器人,然後訪問 `https://api.telegram.org/bot<你的Token>/getUpdates` 取得你的 **Chat ID**。
---
### 第二步:建立通知腳本
請在 Debian 上建立一個腳本(例如 `/usr/local/bin/login_notify.sh`):
```bash
sudo vim /usr/local/bin/login_notify.sh
```
貼入以下內容(請替換 Token 和 Chat ID):
```bash
#!/bin/bash
# Telegram 設定
TOKEN="你的_BOT_TOKEN"
CHAT_ID="你的_CHAT_ID"
ACTION="登入"
# 取得登入資訊
USER_NAME=$PAM_USER
SERVICE=$PAM_SERVICE
TTY=$PAM_TTY
REMOTE_HOST=$PAM_RHOST
TIME=$(date '+%Y-%m-%d %H:%M:%S')
# 如果是登出,可以根據需求調整(PAM 也會觸發登出)
if [ "$PAM_TYPE" = "close_session" ]; then
ACTION="登出"
fi
# 只有在登入成功時才發送 (open_session)
if [ "$PAM_TYPE" = "open_session" ]; then
MESSAGE="🔔 *系統登入通知* 🔔%0A━━━━━━━━━━━━━%0A👤 使用者: $USER_NAME%0A🖥 服務: $SERVICE%0A🌐 來源: $REMOTE_HOST%0A⏰ 時間: $TIME"
curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \
-d "chat_id=$CHAT_ID" \
-d "text=$MESSAGE" \
-d "parse_mode=Markdown" > /dev/null
fi
```
**賦予執行權限:**
```bash
sudo chmod +x /usr/local/bin/login_notify.sh
```
---
### 第三步:設定 PAM 觸發器
我們要把這個腳本掛載到系統的會話管理中。
1. 編輯 PAM 的共通會話設定:
```bash
sudo vim /etc/pam.d/common-session
```
2. 在檔案最後面加入這行:
```text
session optional pam_exec.so /usr/local/bin/login_notify.sh
```
---
### 💡 為什麼要這樣設定? (架構優點)
1. **全面監控**:不論是透過 **SSH**、**本地 TTY** 還是 **sudo su** 登入,只要觸發了 `session` 開啟,PAM 都會執行該腳本。
2. **不影響登入效能**:腳本中使用 `> /dev/null` 和 `curl` 的非阻塞性設計,確保即使 Telegram API 暫時連不上,也不會讓你卡住無法進入系統。
3. **環境變數傳遞**:PAM 會自動提供 `$PAM_USER` (使用者) 和 `$PAM_RHOST` (來源 IP) 等變數,讓你的通知訊息非常精準。
---
### 4. 進階測試
現在你可以開啟一個新的終端機視窗,嘗試用 SSH 登入你的 Debian:
* **如果成功**:你的手機 Telegram 會立刻跳出通知,顯示誰從哪個 IP 進來了。
* **如果沒反應**:請檢查 `/var/log/auth.log`,看看有沒有 `pam_exec` 執行的錯誤訊息。