我今天开始了一份新工作,他们使用 bitbucket,他们使用我的新工作电子邮件地址为我创建了一个帐户。
但是,当我粘贴 SSH 密钥时,Bitbucket 抱怨该密钥已在使用中(我的个人帐户),因此我必须设置另一个密钥。
我的 SSH 配置看起来像这样,但它不起作用,并且似乎选择了错误的密钥:
Host work
HostName bitbucket.org
User git
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_work
IdentitiesOnly yes
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
然后我尝试了
git clone work:path/to/some.git
,但得到“无法从存储库读取。”
我必须编辑掉我的正常
id_rsa
才能工作,所以现在看起来像这样:
Host *
HostName bitbucket.org
User git
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_work
IdentitiesOnly yes
我做错了什么?
使用您的初始配置文件(带有
Host work
和 Host *
的配置文件),您可以执行以下操作:
ssh -Tv work
您将看到实际使用的密钥。如果是id_rsa
,则表示
Host *
中指定的内容优先于
Host work
。如果您想
Host * !work
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_rsa
我假设通配符主机是优先级最低的“后备”选项。我想这不是真的吗?在 SSH 配置文件 (
~/.ssh/config
) 中,选项的应用基于它们在文件中出现的顺序,而不仅仅是基于
Host
模式的特殊性:
Host
块,SSH 检查目标主机是否与指定的模式匹配。多个
Host
块可以匹配同一个目标主机。
Host
块匹配,SSH 将应用该块内的选项。选项是累积的,这意味着它们可以相加,并且后面的选项可以覆盖之前的选项(如果它们用于相同的参数)。
Host *
块之后的通用
Host work
块可以覆盖之前为
work
指定的设置。给定参数的最后一个匹配选项生效。
这就是为什么我从
work
模式中排除 Host *
(
Host * !work
)
或者,您可以将
Host *
块放在 Host work
块之前,但对于
IdentityFile
来说并不可靠:除非您使用 IdentitiesOnly yes
,否则 SSH 仍然可以从匹配块中累积多个身份文件。
有关更多信息,请参阅Chris Siebenmann
的“将向远程服务器提供哪些 SSH 身份以及何时”。