普通视图

发现新文章,点击刷新页面。
昨天 — 2025年12月23日首页

彻底搞懂 SSH 与 Git 的“幕后交易”

作者 ssshooter
2025年12月23日 22:01

很多开发者在配置 GitHub SSH 的时候,通常是按照网上的教程,噼里啪啦一顿复制:先 ssh-keygen,再把公钥贴到 GitHub,最后 git push。如果一切顺利,你会觉得这是一种“魔法”,但一旦报错,往往就一脸懵逼。

其实,这背后是一套非常逻辑严密的“身份代换”过程。

1. 钥匙与锁:非对称加密的“挑战”

SSH 的核心是非对称加密。当你运行 ssh-keygen 时,你其实是产生了一对关系:**私钥(Private Key)**留在你电脑里,相当于你的指纹;**公钥(Public Key)**上传到 GitHub,相当于在 GitHub 门口装了一个只认你指纹的扫描仪。

当你尝试 git push 时,并不是直接发送密码,而是一个“挑战与应答”的过程:

  1. GitHub 拿你的公钥加密一段随机信息发给你。
  2. 只有你电脑里的私钥能解开这段信息并签上名发回去。
  3. GitHub 验证签名成功,门开了。

这就是为什么 SSH 比账号密码安全得多:即便网络被监听,黑客也拿不到你的私钥。

2. 管理员 ssh-agent:你的“钥匙包”

如果你电脑里有很多把钥匙(比如公司的、个人的、不同服务器的),你不可能每次推送代码都手动指定用哪把。

这时候 ssh-add 就出场了。它把你的私钥加载进一个叫 ssh-agent 的后台管家那里。当你发起连接时,这个管家会像拿着一大串钥匙的保安,挨个去试。

但这里有个陷阱:试错是有上限的。如果管家试了 5-6 把钥匙都没对上,GitHub 就会觉得你在暴力破解,直接切断连接。这就是为什么有时候明明钥匙是对的,却依然报错 Too many authentication failures

3. SSH Config:这才是真正的“高级配置”

为了不让管家“盲目试错”,我们需要一个名为 config 的配置文件(在 ~/.ssh/ 目录下)。

这个文件就像一张精确的地图,它告诉 SSH:

  • “如果是去 GitHub,请直接用这把名为 id_ed25519_me 的钥匙。”
  • “不要去试其他的钥匙(IdentitiesOnly yes)。”
  • “甚至如果 22 端口被封了,你可以偷偷走 443 端口。”

有了它,SSH 就不再是猜测,而是精准导航。

4. Git 与 SSH 的“外包关系”

很多人分不清 Git 地址和 SSH 地址。其实,当你看到 git@github.com:user/repo.git 这种地址时,它本质上就是一个 SSH 路径

  • Git 是货物:它只负责打包你的代码变更(Commit)。
  • SSH 是隧道:它负责把这些货物安全地送到远程仓库(Push)。

Git 其实很懒,它根本不负责身份校验。它只是把地址里的 github.com 丢给系统里的 SSH 客户端,说:“喂,帮我连上这个地方,我要发货。”

这时候,SSH 客户端就会去翻你的 config 文件,找对应的钥匙,建立隧道。隧道一旦修通,Git 就在里面欢快地传输数据。

5. 总结:一个完整的链路

当你完成一次成功的提交并推送时,底层逻辑是这样的:

  1. Git Commit:在本地把修改存进仓库。
  2. Git Push:识别到地址是 SSH 格式,呼叫 SSH 客户端。
  3. SSH 寻址:查看 ~/.ssh/config,确定去哪个 IP、用哪个端口、带哪把钥匙。
  4. 身份验证:通过 ssh-agent 提供的私钥与 GitHub 上的公钥完成“暗号对接”。
  5. 数据传输:身份确认,隧道开启,Git 开始搬运代码。

一句话总结:

ssh-keygen 造了钥匙,GitHub 拿了模具,ssh-add 把它挂在腰间,config 给了你一张地图,而 Git 则是那个顺着地图走、拿着钥匙开门送货的快递员。

❌
❌