我有几台系统管理员笔记本电脑和一组服务器。我正在通过一个脚本(称为 )在服务器上管理/轮换 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 中。然后,我们打印数组的第一个元素以显示找到的最后一个条目的主机名。