You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取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

注意事项

  1. 反向DNS解析依赖于IP所属的运营商或管理者配置了反向记录,如果对方是普通家用网络或者没有配置反向DNS,解析结果会是空,这时候脚本会显示“未知主机名”。
  2. 如果你想让客户端主动发送主机名,需要在客户端的~/.ssh/config中添加SendEnv HOSTNAME,同时在服务器的/etc/ssh/sshd_config中添加AcceptEnv HOSTNAME,然后重启sshd服务。但这种方法需要所有客户端配合配置,通用性不强,所以更推荐反向DNS的方案。

备注:内容来源于stack exchange,提问作者ibraheem mohsen

火山引擎 最新活动