如何以编程方式查找默认 ssh 密钥?

如何以编程方式查找默认 ssh 密钥?

根据我的大部分经验,默认情况下,ssh将在 ~/.ssh/id_rsa(.pub) 中查找默认密钥对。

有时我会尝试编写脚本来利用这个默认的密钥位置,但最终我会对其进行硬编码(例如DEFAULT_KEY_LOCATION="${HOME}/.ssh/id_rsa"或类似的东西),我认为这是一件坏事™。

是否有任何环境变量或 ssh 工具的输出可以告诉我用户默认密钥的位置?

例如,是否有类似命令ssh-defaults --key-location或环境变量 $SSH_DEFAULT_KEY?

答案1

来自 ssh 的手册页:

     -i identity_file
         Selects a file from which the identity (private key) for public
         key authentication is read.  The default is ~/.ssh/identity for
         protocol version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and
         ~/.ssh/id_rsa for protocol version 2.  Identity files may also be
         specified on a per-host basis in the configuration file.  It is
         possible to have multiple -i options (and multiple identities
         specified in configuration files).  ssh will also try to load
         certificate information from the filename obtained by appending
         -cert.pub to identity filenames.

随后,如果它位于 ssh 可以自动找到的位置,则根本不需要指定路径。即

ssh -i ~/.ssh/id_rsa [email protected]

ssh [email protected]

两者的工作方式相同。如果您需要以编程方式查找密钥位置,原因并非使用 ssh(即填充授权密钥),则可以检查配置文件检查的所有位置,并解析 ssh_config 文件以查找单个主机条目。来自 man ssh_config:

         The file name may use the tilde syntax to refer to a user’s home
         directory or one of the following escape characters: ‘%d’ (local
         user’s home directory), ‘%u’ (local user name), ‘%l’ (local host
         name), ‘%h’ (remote host name) or ‘%r’ (remote user name).

因此您还必须解析此格式来定位单个文件(如果已定义)。

答案2

由于这个答案仍然在谷歌中返回;有一个比“检查所有位置并解析配置文件”更好的答案。

ssh-config(5)管理调用 ssh 时的复杂配置。该-G选项将在开始任何网络活动之前转储此配置并退出。

-G 使 ssh 在评估主机和匹配块后打印其配置并退出。

我们正在寻找identityfile配置结果,例如,将显示 ssh 在以 git 用户身份连接到 github.com 时将尝试使用哪些密钥。根据许多因素(包括传递给它的选项),可能是 0 个、1 个甚至多个密钥。ssh -G [email protected] | grep ^identityfilessh

最接近正确答案的是

ssh -G [email protected] | awk '$1=="identityfile"{print $2;exit;}'`

它不太可能匹配任何特定配置并让你接近默认值。它还会只找到一个匹配项然后退出,这也许是你想要的,即使它不是特别确定的......

相关内容