使用 SSH 连接到 GitHub 到不在我帐户中的项目

Posted

技术标签:

【中文标题】使用 SSH 连接到 GitHub 到不在我帐户中的项目【英文标题】:Connecting to GitHub with SSH to a project located not in my account 【发布时间】:2021-12-23 10:08:28 【问题描述】:

我试图设置 ssh 密钥,以免每次推送更新时都输入我的用户名/令牌。 我使用本手册设置 ssh 密钥并将 ssh 密钥添加到我的 GitHub 帐户:

https://docs.github.com/en/authentication/connecting-to-github-with-ssh

但它仍然会询问我的用户名/令牌。 我发现我的 URL 地址是 HTTPS 而不是 git@github.com,所以我试图从这里遵循解决方案:

SSH Key - Still asking for password and passphrase

使用命令替换 URL:

git remote set-url origin git@github.com:USERNAME/REPOSITORY.git

但是,由于项目存储库不在我的帐户中(它位于我授权提交更改的公司帐户中),所以这不起作用(看不到存储库)。我不知道我应该如何重写这个命令才能让它工作。

【问题讨论】:

【参考方案1】:

你的困惑让我有点困惑。让我们看看我是否可以纠正自己。 ? 当您向 GitHub 表明自己的身份时,您就声称自己是某人。您声称的某人确实有权访问某个存储库,或者没有有权访问该存储库。

(到目前为止和我在一起?)

当您使用 HTTPS“登录”到 GitHub 时,您提供:

用户名:这只是一个用户名,即它不是秘密,它可以识别你是谁;和 密码(无论如何在 Ye Olden Dayse 中):这只是你的秘密密码,它所做的只是证明你就是你所说的那个人。

他们现在想出了一些办法,而不是“密码”,而是提供“PAT”,这仍然是一个秘密,但现在有一些内部结构可以让你做一些花哨的事情,比如说一些 PAT 的密码更少认证价值高于其他人。这也意味着,如果您的“密码”(即 PAT)被泄露,您仍然拥有真正机密的密码(实际密码),您可以使用它来撤销旧的 PAT 并生成新的 PAT。

如果你喜欢这个系统,你可以继续使用它,但是如果你喜欢 ssh 系统——这是我自己的偏好——那么我们有一个有点棘手的东西。当您使用 ssh “登录” GitHub 时,您提供:

固定用户名git:这不是秘密,但它也不能识别和 一个 ssh 密钥,由 ssh-keygen 或类似程序生成。

ssh 密钥不是,也从来不是,只是一个密码。它充满了结构:例如,它说明了使用什么样的加密来制作它,以便我们知道它是旧的非常短的 RSA 密钥(不再安全)、更长的 RSA 密钥(仍然安全)、 ECDSA 密钥、ed25519 密钥等。它们也成对出现: 每对都有一个公钥和一个私钥。 public 密钥的设计目的是让您可以将其交给其他人——包括 GitHub——甚至可以是明文。你把这个密钥的其他人可以向你发送一个“挑战”,他们已经加密了;您的计算机使用您相应的私钥来解密“挑战”并做出响应,证明您实际上就是您声称的那个人。

但请稍等。 你声称自己是谁?我们刚刚说过我们将声称自己是固定名称git。好吧,现在我们有了一个有点肮脏的技巧:这些公钥和私钥对是唯一的。当您生成您的配对时,您交给 GitHub 的公钥是唯一的。他们(GitHub)所要做的就是记录您在向他们提供公钥时的身份,您可以使用您的实际密码登录 GitHub。

所以,你在这里,做你自己,在你的电脑上,用你的 ssh。例如,您可能已经生成了 三个 身份密钥。如果只有 这三个中的一个 可以访问您想要的存储库,您只需向 GitHub 提供一个 有效 有效的身份密钥,而不是另外两个 不要工作。

你这样做的方式是......根本不使用 Git。 Git 不做 ssh。 Git 运行 ssh,它完成了所有的 ssh 工作。所以你必须检查你的 ssh 文档。1 幸运的是,几乎所有的 ssh 实现都有很多共同点,包括 $HOME/.ssh/config 文件的想法。这些配置文件让您告诉 ssh,如果您要求连接到名为 hub-id1 的主机,您希望使用 one 密钥对连接到实际名为 github.com 的主机。如果您要求连接到名为hub-id2 的主机,您希望使用不同的单个密钥对 来连接到实际名为github.com 的主机。您可以重复使用尽可能多的密钥对,使用尽可能多的身份。

为此,在您的 .ssh/config 文件中,您需要这些神奇的线条:

Host hub-id1
    Hostname github.com
    IdentityFile ~/.ssh/id_github_1
    User git
    IdentitiesOnly yes

Host hub-id2
    Hostname github.com
    IdentityFile ~/.ssh/id_github_2
    User git
    IdentitiesOnly yes

等等。

Host 行中的主机名由您决定,但它应该与您在 ssh URL 中设置的名称相匹配:

git remote set-url origin ssh://hub-id2/path/to/repo.git

或:

git remote set-url origin hub-id2:path/to/repo.git

User 行是可选的,但如果你在这里包含它,你可以在你放置 git@github.com 的地方前面省略 git@,但现在放置 git@hub-id1 等等.

HostName 行是必需的:这是 ssh 将查找的 IP 地址以连接到 GitHub。

IdentityFile 行是必需的: 它提供了您存储公钥和/或私钥的文件的路径名。这里有一点小技巧:如果你使用 ssh agent,你可以只提供.pub 文件的路径名,而你只需要.pub 文件on em> 例如,如果您从笔记本电脑登录到某些公司机器并且仅将私钥保存在笔记本电脑上,则此主机。但是,在某些情况下,您必须将 ssh 指向私钥文件,并让公钥具有相同的名称但添加了 .pub

IdentitiesOnly 行是可选的,但建议使用:它表示只使用我在此处列出的密钥。如果您省略这一行,ssh 也会尝试 other 键,如果 IdentityFile 键似乎不起作用。 (您可以通过ssh -Tv 输出观察到这一点:ssh 尝试的每个键都会产生一个调试行。)

如果您在 GitHub 上只有一个身份,则不需要这种复杂性。 您在 GitHub 上的一个身份(即您自己)将允许您访问存储库,或者不会,基于存储库设置的拥有。但是,如果您在 GitHub 上有多个身份,并且正在使用 ssh,这就是您告诉 ssh 命令将哪个身份发送到 GitHub 的方式。

(请注意,如果您使用密码对您的私有 ssh 密钥进行加密访问,您可能需要将密码输入 ssh 或您的 ssh 代理。这完全独立于上述所有内容。)


1在 Windows 系统上,Git 带有一个替代 ssh,2 以防你的 Windows ssh 太旧而无法使用。现代 Windows 带有一个可用的现代 ssh。这两个不同的 ssh-es 可能使用不同的文件存储。请注意您使用的是哪个 ssh。确保您的 Git 使用您希望它使用的 ssh,无论是哪个。大多数其他系统更容易处理,因为它们只有一个 ssh。

2这类似于 Git-for-Windows 通常带有可用版本的bash,因为旧 Windows 系统中的旧 CLI 无法使用(至少 Git 无法使用)。包含的 bash(简称为 git-bash)和包含的 ssh 实际上都不是 Git 的一部分。它们只是 Git for Windows 打包在一起,以使其可用

【讨论】:

感谢您的精彩解释。我使用了 git remote set-url origin hub-id2:path/to/repo.git,其中“hub-id2”是“git@github.com”,现在可以使用了。

以上是关于使用 SSH 连接到 GitHub 到不在我帐户中的项目的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 github 帐户连接到命令行? [复制]

无法通过 ssh 连接到 Github,无法访问 .ssh.config

如何使用 Visual Studio 2019 使用 ssh 密钥连接到组织的 github 存储库?

在 GitHub 上使用 HTTPS 或 SSH

通过 SSH 将 VS Code 连接到 Github 导致 SSH 错误

通过 ssh 将 EC2 连接到 Git