SSH 配置 - 相同的主机但不同的密钥和用户名

SSH 配置 - 相同的主机但不同的密钥和用户名

我已经设置了两个 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 pushIdentityFileUser设置Host。输出与上一个配置相同。

我认为 git 会自动搜索 Host “github.com”,因为远程就是这样的。据说 Host 可以是任何你想要的(https://stackoverflow.com/a/3828682)。有没有办法从 ssh 配置中更改特定 repo 应该使用哪个主机?

如果我能仅从 ~/.ssh/config 解决这个问题,那就太理想了。

答案1

是的,仅有的搜索节标题(HostMatch行)——其他所有内容仅作为设置应用。换句话说,如果您连接到[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 配置:

  1. 创建一个包含以下内容的文件~/.config/git/config.user1

    [url "github_username1:"]
        insteadOf = [email protected]:
    
  2. 创建一个config.user2除了“github_username2”之外相同的文件。

  3. 在主~/.config/git/config文件中,告诉 Git 根据您所在的目录“包含”两个文件之一:

    [includeIf "gitdir:~/projects/"]
        path = ~/.config/git/config.user1
    
    [includeIf "gitdir:~/src/work/"]
        path = ~/.config/git/config.user2
    
  4. 现在,无论您何时位于~/src/work/,从 克隆任何内容[email protected]:[etc]都会自动将 URL 重写为github_username2:[etc]

相关内容