如何强制 ssh 使用特定的私钥?

Her*_*ink 103 ssh openssh private-key

随着ssh -i <private key filename>您可以指示ssh来使用额外的私钥来尝试验证。

文档并不清楚如何明确使用该密钥。

Her*_*ink 139

您可以使用 IdentitiesOnly 选项:

ssh -o "IdentitiesOnly=yes" -i <private key filename> <hostname>

  • 实际上 'IdentitiesOnly' 禁用提示 ssh-agent,但仍提供默认值和 ssh_config'd 键。 (17认同)
  • 对我来说重要的是它不会在例如我的 ~/.ssh 目录中查找要尝试的密钥。 (4认同)
  • 谢谢!我需要 `-o "IdentitiesOnly=yes"` 位来防止 `ssh-agent` 覆盖指定的私钥。 (3认同)
  • 当您将密钥缓存在 ssh-agent 中时,这对于确定哪个密钥适用于给定主机非常方便。在没有这个标志的情况下,我能弄清楚的唯一方法是使用 strace 转储 IO,这非常乏味。 (3认同)
  • 你还可以在你的 `ssh` 命令中添加 `-v` 以了解正在使用哪个密钥(如果一个不够,添加更多的 `v`) (3认同)
  • 否决,因为它尝试使用我没有用“-i”指定的“.ssh/id_rsa”。该答案没有回答标题中所述的问题。 (3认同)
  • Thomas 是对的,即使使用 `-o "IdentitiesOnly=yes" -i &lt;private key filename&gt;`,.ssh/config 中的默认 `IdentityFile` 密钥也会在指定的身份之前使用。罗格罗沃在2014年也说过同样的话 (2认同)
  • 请参阅 [brandon 的答案](https://superuser.com/a/1777452) 了解如何实际仅使用指定的密钥。 (2认同)

bra*_*don 15

接受的答案是不正确的,因为除了参数指定的文件之外,默认配置中的所有身份文件也将被使用-i。如果您连接的设备具有身份验证尝试限制,在最终获得正确的密钥之前可能会超出该限制,这可能会出现问题。

要强制它使用单个私钥文件,并且仅使用该密钥,您可以使用参数指定一个不存在的配置文件-F

ssh -F /dev/null -o IdentitiesOnly=yes -i <private key filename> <hostname>
Run Code Online (Sandbox Code Playgroud)

使用-v参数将显示正在使用的键。您现在应该看到只使用了一个。查找“将尝试按键:”行。

  • 支持这一点,接受的答案仍然尝试了我的 ~/.ssh/id_ed25519 文件,而这个只尝试给定的密钥。另请参阅@rogerovo 对已接受答案的评论。 (3认同)
  • @HermanvanRink,我刚刚仔细检查过,但这不起作用。正如 ssh_config 手册页所述,“配置文件中可以指定多个身份文件;所有这些身份将按顺序尝试。”。如果没有 -F 指向不同的文件,则在任何 -o 选项之上使用默认值(通常是 ~/.ssh/config)(有关 -F 参数,请参阅 `ssh` 手册页)。如果该默认配置中有匹配的条目,例如“Host *”,那么它们都会被使用。 -v 显示加载的配置文件以及使用的标识文件。 (2认同)

Use*_*erK 6

另一种方法是使用生成一对密钥

ssh-keygen
Run Code Online (Sandbox Code Playgroud)

并为指定的主机和对应的私钥创建一个特殊的配置

编辑 ~/.ssh/config

Host handy_server
    HostName x.y.z.w
    IdentityFile ~/.ssh/handy.pub
    IdentitiesOnly yes
    User userk
    Port 22
Run Code Online (Sandbox Code Playgroud)