如何获取SSH远程连接设备的主机名并集成到Telegram告警脚本中
如何获取SSH远程连接设备的主机名并集成到Telegram告警脚本中
首先得明确一点:你用whoami拿到的是登录服务器的本地Linux用户名,和远程连接设备的主机名完全是两回事,而且你也没办法直接在远程连接的设备上执行命令(除非你有反向访问对方设备的权限,这显然不现实也不安全)。不过我们有更靠谱的方法来获取远程设备的主机名,下面给你详细说明:
可行的解决方案:反向DNS解析远程IP
SSH连接时,服务器端的SSH_CONNECTION环境变量已经包含了远程设备的IP地址,我们可以通过反向DNS解析这个IP来获取对应的主机名——这是最通用的方法,不需要客户端做任何额外配置。
步骤1:确保解析工具可用
Ubuntu 20.04默认可能没有安装dig命令,你可以先安装dnsutils包:
sudo apt update && sudo apt install dnsutils -y
如果不想安装额外工具,也可以用系统默认的host命令,后面会给出两种写法。
步骤2:修改你的Telegram告警脚本
下面是修改后的完整脚本,我已经加入了远程主机名的获取逻辑:
#!/usr/bin/env bash # 导入配置文件中的凭证 . /home/roots/credentials.config URL="https://api.telegram.org/bot${KEY}/sendMessage" DATE="$(date "+%d %b %Y %H:%M")" if [ -n "$SSH_CLIENT" ]; then # 提取远程连接的IP地址 ip="$(echo $SSH_CONNECTION | cut -d " " -f 1)" # 方法1:用dig命令反向解析IP获取主机名(推荐,输出更简洁) remote_hostname=$(dig -x "$ip" +short | sed 's/\.$//') # 方法2:如果不想安装dnsutils,用host命令替代 # remote_hostname=$(host "$ip" | awk '/pointer/ {print $NF}' | sed 's/\.$//') # 如果解析失败(比如IP没有反向DNS记录),设置默认提示 if [ -z "$remote_hostname" ]; then remote_hostname="未知主机名" fi # 构造包含远程主机名的告警文本 TEXT="新的SSH登录通知: 本地用户名:${USER} 远程IP:(*${ip}*) 远程主机名:(*${remote_hostname}*) 登录时间:${DATE}" # 发送Telegram消息 curl -s -d "chat_id=${USERID}&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" $URL > /dev/null fi
注意事项
- 反向DNS解析依赖于IP所属的运营商或管理者配置了反向记录,如果对方是普通家用网络或者没有配置反向DNS,解析结果会是空,这时候脚本会显示“未知主机名”。
- 如果你想让客户端主动发送主机名,需要在客户端的
~/.ssh/config中添加SendEnv HOSTNAME,同时在服务器的/etc/ssh/sshd_config中添加AcceptEnv HOSTNAME,然后重启sshd服务。但这种方法需要所有客户端配合配置,通用性不强,所以更推荐反向DNS的方案。
备注:内容来源于stack exchange,提问作者ibraheem mohsen




