反向 DNS 查找以匹配authorized_keys 中的主机名

反向 DNS 查找以匹配authorized_keys 中的主机名

我有几台系统管理员笔记本电脑和一组服务器。我正在通过一个脚本(称为 )在服务器上管理/轮换 ssh 密钥,rotate_keys.sh该脚本将在任何系统管理员笔记本电脑上运行。

我制定了这样的规则:每台服务器最多保留给定系统管理员笔记本电脑的 1 个(最新的)ssh 密钥。

ssh 密钥存储在authorized_keys采用以下形式的文件中:

key1 user@device1-hostname
key2 user@device2-hostname
key3 user@device3-hostname

每个服务器都有一个脚本(称为update_keys.sh),通过 ssh 执行时,将删除与当前连接到它的计算机关联的所有密钥。我(尝试)通过删除包含给定客户端主机名的所有行来做到这一点。

sed -i "/$client_hostname/d" authorized_keys

在服务器上,我通过对环境变量$SSH_CONNECTION(在 ssh 会话开始时设置)中的 IP 地址进行反向 dns 查找来获取客户端的主机名。

client_ip=$(echo $SSH_CONNECTION | awk '{print $1}')
client_hostname=$(nslookup $client_ip \
                | tail -2 \
                | head -1 \
                | awk '{print $4}')

这将返回以下格式的主机名:

device-hostname.router-hostname.

由于缺乏更好的术语,它给了我一个“完全限定的主机名”。

但是,其中的主机名authorized_keys省略了这些设备所连接的路由器(子网)的主机名。它们只是显示为:

device-hostname

因此,当我执行以下删除命令时,没有任何匹配项。

sed -i "/$client_hostname/d" authorized_keys

有没有办法强制 ssh 守护进程记录“完全限定”主机名。或者是否有一个 dns 查找工具只能给我设备的名称,减去其连接的路由器的主机名?

我宁愿采用上述两种方法之一,而不是在 ssh 守护进程(在服务器上)中禁用反向 dns,因为这需要我的系统管理员笔记本电脑具有静态 ip。

答案1

尝试以下 awk 命令:

nslookup $client_ip | awk '/name =/ { split($4,add,".") } END { print add[1]}'

这将运行 nslookup 命令,查找所有带有名称 = 的行,然后用 分割第四个空格分隔的空格字段。将结果放入数组 add 中。然后,我们打印数组的第一个元素以显示找到的最后一个条目的主机名。

相关内容