github SSH 是如何工作的?

Posted

技术标签:

【中文标题】github SSH 是如何工作的?【英文标题】:How does github SSH works? 【发布时间】:2020-09-04 15:20:39 【问题描述】:

我很好奇使用 git 克隆项目。为了克隆我们正在调用的项目:

git clone git@github.com:MY_GIT_USERNAME/PROJECT.git

所以我们在这里所做的,是以用户 git 的身份访问 github.com。我想当有一个 MY_GIT_USERNAME/PROJECT 是某种目录,它添加了一些访问和密钥,然后通过存储库验证到真正的 github 服务器,所以我们通过 git clone 访问的那个是某种代理一,仅用于验证和授权请求,对吗?

github 是否使用某种工具来存储所有 ssh 密钥?有这样的工具吗?

另外,如果 git clone 不能像这个一样工作,它是如何工作的? which 与典型的 ssh 命令相似如何工作?

【问题讨论】:

【参考方案1】:

您可以在系统变量中缺少 ssh 代理/变量。如果您安装腻子或任何具有预先启用设置的东西,它可能会起作用

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

Git 使用 SSH 建立安全连接,通过它可以执行命令。您将在您的 ssh 用户名 git 和要连接的主机 github.com 中传递它。到目前为止,这是正常的 SSH。

您还可以将路径传递给它以查找您的 Git 存储库,MY_GIT_USERNAME/PROJECT.git。对于普通的 Git,这将是一条文字路径。

为避免必须为每个 Github 用户创建一个 ssh 用户,Github 将忽略 git 用户并使用链接到您帐户的私有 ssh 密钥来识别您。这不是不常见的 ssh 身份验证方式。

一个简单的实现会将所有存储库存储在像 /git/MY_GIT_USERNAME/PROJECT.git/ 这样的文件系统上,但 Github 已经长期、长期、长期地扩展了过去这样的简单解决方案。

我不知道 Github 内部是如何工作的,但它们肯定在多个存储库之间共享对象。例如,如果多个存储库提交相同的内容,它很可能只会存储一次。同样,在 Github 上 fork 一个存储库可能实际上并不会复制整个存储库,而是有一个共享存储库。由于 Git 存储库已经基于校验和,这相对很容易;虽然在 Github 的规模上,我确信它不是。

要了解更多信息,请阅读Git Internals。特别是Git Objects 和Transfer Protocols。

【讨论】:

但是项目的授权是如何工作的?例如,如果我尝试克隆一个私有项目,这怎么知道我无权访问它?我可以指定哪个键只允许访问几个文件/目录吗? @Ajris 他们有某种数据库来存储与用户、组织、存储库等相关的所有信息和权限。 AFAIK 没有详细的文件/目录级别访问控制,这不是 Git 的用途。如果您需要此类详细信息,请将您的存储库分解为多个存储库并使用teams and organizations。我怀疑您正在尝试解决特定问题,也许您应该问一下。【参考方案3】:

这只是一般的 SSH 身份验证。通常,URL 包含有关传输协议、远程服务器地址和存储库路径的信息。您将在其中将id_rsa.pub.pub 文件是您的公钥)提供给 Github 的 SSH 密钥。然后,当您连接到 Github 时,您的 ~/.ssh 文件夹中有私钥 id_rsa,然后用于通过 Github 验证您的信息。您将锁(公钥)放在您想要轻松访问的任何服务器上,并将(私钥)保存在您的机器上,并使用它来登录这些服务器;他们看到你有一把适合锁的钥匙,然后让你进去。

【讨论】:

以上是关于github SSH 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

通过 ssh 登录另一台机器(不提供密码)时,如何与 github 正常交互?

如何在 Windows 上通过 TortoiseGIT 应用 SSH 密钥个人访问 github?

为不同的 GitHub 帐户使用多个 SSH 密钥

Linux配置SSH Key到GitHub

我们用ssh登录GitHub到底经历了什么?

如何:Teamcity + GitHub