1. 设置一个白名单列表
  2. 检查到登录用户IP信息不在白名单,发送信息到指定邮箱
#!/bin/bash

# 定义常用IP地址列表文件
KNOWN_IP_FILE="/path/to/known_ips.txt"  # 替换为实际路径

# 定义邮件接收者
EMAIL_TO="test@163.com"

# 定义日志文件
LOG_FILE="/var/log/monitor_login.log"

# 检查常用IP地址列表文件是否存在
if [ ! -f "$KNOWN_IP_FILE" ]; then
  echo "$(date) - ERROR: 常用IP地址列表文件 $KNOWN_IP_FILE 不存在。" >> "$LOG_FILE"
  exit 1
fi

# 获取当前登录用户信息
current_login_info=$(who)

# 检查是否获取到登录信息
if [ -z "$current_login_info" ]; then
  echo "$(date) - ERROR: 无法获取当前登录信息。" >> "$LOG_FILE"
  exit 1
fi

# 提取当前登录的IP地址并去掉括号
current_ips=$(echo "$current_login_info" | awk '{print $5}' | tr -d '()' | sort | uniq)

# 检查是否获取到IP地址
if [ -z "$current_ips" ]; then
  echo "$(date) - INFO: 当前无登录用户或无法提取IP地址。" >> "$LOG_FILE"
  exit 0
fi

# 检查当前登录的IP是否在常用IP列表中
for ip in $current_ips; do
  if ! grep -q "$ip" "$KNOWN_IP_FILE"; then
    # 如果IP不在常用列表中,发送邮件通知
    mail_subject="警报: 检测到来自IP $ip 的异常登录"
    mail_body="检测到来自IP: $ip 的异常登录\n\n当前登录详细信息:\n$current_login_info"
    
    echo "$mail_body" | mail -s "$mail_subject" "$EMAIL_TO"
    
    # 记录到日志文件
    echo "$(date) - ALERT: 发送警报邮件,检测到来自IP $ip 的异常登录。" >> "$LOG_FILE"
  else
    echo "$(date) - INFO: 登录IP $ip 在常用列表中。" >> "$LOG_FILE"
  fi
done