![如何以编程方式查找默认 ssh 密钥?](https://linux22.com/image/630282/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E6%9F%A5%E6%89%BE%E9%BB%98%E8%AE%A4%20ssh%20%E5%AF%86%E9%92%A5%EF%BC%9F.png)
根据我的大部分经验,默认情况下,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 ^identityfile
ssh
最接近正确答案的是
ssh -G [email protected] | awk '$1=="identityfile"{print $2;exit;}'`
它不太可能匹配任何特定配置并让你接近默认值。它还会只找到一个匹配项然后退出,这也许是你想要的,即使它不是特别确定的......