我已经设置了两个 GitHub 帐户,但无法让 ssh 密钥正常工作。我尝试了各种配置。
Host github_username1
HostName github.com
IdentityFile ~/.ssh/rsa_1
User username1
Host github_username2
HostName github.com
IdentityFile ~/.ssh/rsa_2
User username2
git push
:
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
适用于用户名1:
Host github.com
HostName github.com
IdentityFile ~/.ssh/rsa_1
User username1
Host github.com
HostName github.com
IdentityFile ~/.ssh/rsa_2
User username2
git push
在 username2 的 repo 中:
ERROR: Permission to username2/repo.git denied to username1.
fatal: The remote end hung up unexpectedly
我也尝试了相同git push
的IdentityFile
和User
设置Host
。输出与上一个配置相同。
我认为 git 会自动搜索 Host “github.com”,因为远程就是这样的。据说 Host 可以是任何你想要的(https://stackoverflow.com/a/3828682)。有没有办法从 ssh 配置中更改特定 repo 应该使用哪个主机?
如果我能仅从 ~/.ssh/config 解决这个问题,那就太理想了。
答案1
是的,仅有的搜索节标题(Host
或Match
行)——其他所有内容仅作为设置应用。换句话说,如果您连接到[email protected]
,OpenSSH 将仅查找标题为 的节Host bar.com
。
因此,如果您有Host github_username2
,您也必须在 Git 远程服务器中使用完全相同的“主机名”。如果您使用[电子邮件保护]。
但是,这并不是导致身份验证失败的原因。通过 SSH 连接到 GitHub 时,您必须使用git
作为用户名 - 服务器将仅根据密钥识别您。(换句话说,“git@”中的“[电子邮件保护]“实际上是 GitHub 使用的 SSH 用户名 – 而不是某种 URI 方案。)
因此正确的 SSH 配置是:
Host github_username1
Hostname github.com
User git
IdentityFile ~/.ssh/rsa_1
IdentitiesOnly yes
Host github_username2
Hostname github.com
User git
IdentityFile ~/.ssh/rsa_2
IdentitiesOnly yes
使用以下 Git 配置:
[remote "origin"]
url = github_username1:username2/repo.git
(指定 SSH 用户名的位置无关紧要 - 您可以git@
在 URL 中指定,也可以User git
在 .ssh/config 中指定,或者两者兼而有之。)
根据 repo 路径自动切换账户的替代 Git 配置:
创建一个包含以下内容的文件
~/.config/git/config.user1
:[url "github_username1:"] insteadOf = [email protected]:
创建一个
config.user2
除了“github_username2”之外相同的文件。在主
~/.config/git/config
文件中,告诉 Git 根据您所在的目录“包含”两个文件之一:[includeIf "gitdir:~/projects/"] path = ~/.config/git/config.user1 [includeIf "gitdir:~/src/work/"] path = ~/.config/git/config.user2
现在,无论您何时位于
~/src/work/
,从 克隆任何内容[email protected]:[etc]
都会自动将 URL 重写为github_username2:[etc]
。