我想在脚本中实现一个函数,用于检查 known_hosts 文件中与给定主机相对应的密钥是否正确。执行此操作的明显方法是尝试建立 ssh 连接并解析是否导致 known_hosts 警告。由于以下原因,这不是最佳选择:
- 如果主持人不是在 know_hosts 文件中,需要单独检查
- 它依赖于警告的特定措辞,这些措辞可能会发生变化
- 它在目标服务器上为你运行一个 ssh 命令,但你不需要运行该命令,并且该命令可能由于各种原因(例如指定了哪个登录 shell)而失败
- 需要有效的凭证
ssh-keyscan
我尝试在选项和命令中找到ssh-keygen
可能进行该检查的选项,但没有找到。
进行此项检查的最简单方法是什么?
答案1
#!/usr/bin/env bash
HOST=$1
set -o pipefail
HOST_KEY_LINE=$(ssh-keygen -F "$HOST" | tail -n1)
if [ $? -ne 0 ]; then
echo "$HOST is not in the known_hosts file"
exit 1
fi
KEY_TYPE=$(echo "$HOST_KEY_LINE" | awk '{ print $2 }')
HOST_KEY=$(echo "$HOST_KEY_LINE" | awk '{ print $3 }')
ACTUAL_KEY=$(ssh-keyscan -t "$KEY_TYPE" "$HOST" 2>&1 | tail -n1 | awk '{ print $3 }')
if [ $? -ne 0 ]; then
echo "Could not get key from $HOST: $ACTUAL_KEY"
exit 1
fi
if [ "$HOST_KEY" = "$ACTUAL_KEY" ]; then
echo "known_hosts has a correct key"
exit 0
fi
echo "known_hosts has an incorrect key"
答案2
如果您有所有可用主机的列表,则可以使用以下命令:
ssh-keyscan -t rsa,dsa -f hosts_list > ~/.ssh/known_hosts_revised
这将生成一个新的known_hosts_revised
,您可以使用它与当前的进行比较know_hosts
以查看差异。
内容hosts_list
应该是这样的:
1.2.3.4,1.2.4.4 name.my.domain,name,n.my.domain,n,1.2.3.4,1.2.4.4
答案3
我在 Windows 10 下,我可以获得已保存通过发出以下命令获取 SSH 密钥:
ssh-keygen -F sdf.org
获得以下输出
# Host sdf.org found: line 1
sdf.org,205.166.94.16 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJJk3a190w/1TZkzVKORvz/kwyKmFY144lVeDFm80p17
使用以下命令我可以获得当前的SSH 密钥:
ssh-keyscan -t ed25519 sdf.org
获取输出
# sdf.org:22 SSH-2.0-OpenSSH_8.8
sdf.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJJk3a190w/1TZkzVKORvz/kwyKmFY144lVeDFm80p17
我可以直观地比较这两个值,以确保 SSH 密钥正确。我敢打赌,也可以在批处理文件中完成(但我不知道怎么做)