如何编写脚本检查 known_hosts 文件中的密钥是否正确

如何编写脚本检查 known_hosts 文件中的密钥是否正确

我想在脚本中实现一个函数,用于检查 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 密钥正确。我敢打赌,也可以在批处理文件中完成(但我不知道怎么做)

相关内容