SSH登录通知脚本相关技术咨询:获取登录信息、脚本故障影响及失败登录通知实现
SSH登录通知脚本相关技术咨询:获取登录信息、脚本故障影响及失败登录通知实现
一、获取SSH登录用户与来源IP
你的脚本里已经用到了SSH_CLIENT环境变量,这个变量的格式是来源IP 远程端口 本地端口,我们可以从中提取IP;而当前登录的用户名可以直接用$USER环境变量获取。修改你的脚本部分内容如下:
if [ -n "$SSH_CLIENT" ]; then # 获取当前登录的用户名 LOGIN_USER=$USER # 从SSH_CLIENT中提取来源IP(取第一个字段) SOURCE_IP=$(echo "$SSH_CLIENT" | awk '{print $1}') # 拼接通知文本 TEXT="检测到新的SSH登录: 用户:$LOGIN_USER 来源IP:$SOURCE_IP" # 发送邮件,注意text参数要加双引号让变量展开 curl -s --user 'api:key-xxxxxxd3e1bd13c13cbxxxxxx' \ https://api.eu.mailgun.net/v3/mydomain.com/messages \ -F from='Server Notification <postmaster@mydomain.com>' \ -F to='myadminmail@gmail.com' \ -F subject="New SSH login detected" \ -F text="$TEXT" fi
这样就能在邮件里看到具体的登录用户和来源IP了。
二、脚本故障是否会影响SSH登录
默认情况下,不会影响正常登录。因为/etc/profile是登录shell初始化阶段执行的脚本,shell默认不会因为单个命令执行失败就终止整个登录流程(除非你在脚本里手动设置了set -e,强制命令失败时退出)。
不过为了避免网络问题导致curl命令卡住、拖慢登录速度,建议把发送邮件的命令放到后台执行,同时丢弃无关输出,修改后的curl命令如下:
curl -s --user 'api:key-xxxxxxd3e1bd13c13cbxxxxxx' \ https://api.eu.mailgun.net/v3/mydomain.com/messages \ -F from='Server Notification <postmaster@mydomain.com>' \ -F to='myadminmail@gmail.com' \ -F subject="New SSH login detected" \ -F text="$TEXT" &>/dev/null &
这里的&>/dev/null会把标准输出和错误输出都丢弃,&会把命令放到后台运行,完全不影响登录过程。
三、实现失败登录的邮件通知
成功登录才会触发/etc/profile,失败登录不会执行这个脚本,所以我们需要通过监控系统认证日志来实现失败登录通知,具体步骤如下:
1. 编写监控脚本
创建一个脚本文件(比如/usr/local/bin/ssh-fail-monitor.sh),内容如下:
#!/bin/bash # 根据你的系统调整日志路径:Debian/Ubuntu用/var/log/auth.log,RHEL/CentOS用/var/log/secure LOG_FILE="/var/log/auth.log" MAILGUN_KEY="key-xxxxxxd3e1bd13c13cbxxxxxx" DOMAIN="mydomain.com" TO_EMAIL="myadminmail@gmail.com" # 实时跟踪日志文件,匹配失败登录相关条目 tail -fn0 "$LOG_FILE" | while read LINE; do # 匹配常见的失败登录关键词,可根据需要调整 if echo "$LINE" | grep -E "(Failed password|Invalid user|Connection closed by authenticating user)"; then # 提取尝试登录的用户和IP(不同系统日志格式可能略有差异,可根据实际调整awk字段) FAILED_USER=$(echo "$LINE" | awk '/Failed password|Invalid user/ {print $9}') FAILED_IP=$(echo "$LINE" | awk '/Failed password|Invalid user/ {print $11}') # 拼接通知文本 TEXT="检测到SSH登录失败: 发生时间:$(date "+%Y-%m-%d %H:%M:%S") 日志详情:$LINE 尝试登录用户:$FAILED_USER 来源IP:$FAILED_IP" # 发送警告邮件 curl -s --user "api:$MAILGUN_KEY" \ https://api.eu.mailgun.net/v3/$DOMAIN/messages \ -F from='Server Notification <postmaster@mydomain.com>' \ -F to="$TO_EMAIL" \ -F subject="SSH登录失败警告" \ -F text="$TEXT" &>/dev/null fi done
2. 设置开机自启
创建systemd服务文件/etc/systemd/system/ssh-fail-monitor.service,内容如下:
[Unit] Description=SSH Failed Login Monitor After=network.target [Service] ExecStart=/usr/local/bin/ssh-fail-monitor.sh Restart=always User=root [Install] WantedBy=multi-user.target
然后执行以下命令启用并启动服务:
chmod +x /usr/local/bin/ssh-fail-monitor.sh systemctl daemon-reload systemctl enable --now ssh-fail-monitor.service
这样系统就会实时监控SSH失败登录事件,并自动发送警告邮件了。
备注:内容来源于stack exchange,提问作者gabogabans




