副标题:别再让 Permission denied (publickey) 毁掉你的深夜加班!手把手教你一次搞定 SSH,从此 git push 如丝般顺滑。


📚 目录


第 1 章:你的 SSH 密钥藏哪儿了?——快速定位密钥文件

天下难事,必作于易;天下大事,必作于细。” ——《道德经》
SSH 密钥虽小,却是连接你与代码世界的唯一信物。找不对地方,再强的算法也白搭。

很多开发者一遇到 git@github.com: Permission denied (publickey) 就慌了神,其实90% 的问题出在“根本没找到正确的密钥”

SSH 密钥默认存在用户家目录下的 .ssh 文件夹中。但你可能:

  • 用过不同电脑,密钥名五花八门(id_rsa, github_key, my_laptop_ed25519…)
  • 重装系统后以为“自动生成了”,其实没有
  • 把私钥删了只留公钥,结果无法认证

✅ 正确做法:列出所有潜在密钥

ls -al ~/.ssh

你会看到类似:

-rw------- 1 user user  411 Jun 10 10:00 id_ed25519
-rw-r--r-- 1 user user   98 Jun 10 10:00 id_ed25519.pub
-rw------- 1 user user 1823 Jun 10 09:30 github_work
-rw-r--r-- 1 user user  411 Jun 10 09:30 github_work.pub

🔑 记住

  • 私钥(无 .pub)必须存在且权限为 600
  • 公钥(带 .pub)才是你要贴到 GitHub 的内容

💡 小技巧:检查当前 ssh-agent 加载了哪些密钥

ssh-add -l

如果为空,说明你还没把私钥“插入”认证代理——下一章会教你怎么加。


第 2 章:生成一把“金钥匙”——安全又高效的密钥创建法

工欲善其事,必先利其器。” ——《论语》
一把好钥匙,不仅要打得开锁,还要防得住撬。Ed25519 就是那把“现代金钥匙”。

别再用 ssh-keygen -t rsa 了!RSA 虽然通用,但Ed25519 更快、更短、更安全,且被 GitHub 官方推荐。

✅ 推荐命令(带邮箱,避免后续麻烦)

ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519
  • -t ed25519:使用 Ed25519 算法(比 RSA 快 10 倍以上)
  • -C "...":注释里带上邮箱,GitHub 会用它识别你
  • -f:指定文件名,避免覆盖已有密钥

⚠️ 如果系统报错 unknown key type ed25519,说明 OpenSSH 版本太老(<6.5),改用:

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

🔐 设置 passphrase(可选但推荐)

生成时会让你输入 passphrase。虽然每次用要输密码,但能防止私钥被盗后直接滥用。配合 ssh-agent,一天只需输一次。


第 3 章:GitHub 不认你?可能是“钥匙没插对锁孔”

差之毫厘,谬以千里。” ——《礼记·经解》
公钥少一个字符,或多了个空格,GitHub 就会把你拒之门外。

很多人复制公钥时犯了致命错误:

  • 用鼠标拖选,漏掉开头的 ssh-ed25519
  • 复制时自动换行,粘贴后变成两行
  • 在 Windows 上用记事本打开,编码乱了

✅ 正确复制方式(Linux/macOS)

# 直接输出到终端,全选复制(确保是一整行!)
cat ~/.ssh/id_ed25519.pub

输出应类似:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIG... your_email@example.com

🛠️ GitHub 添加步骤(关键细节!)

  1. 登录 GitHub → Settings → SSH and GPG keys
  2. New SSH key
  3. Title:填设备名,如 My Ubuntu Laptop
  4. Key type:选 Authentication Key
  5. Key粘贴整行内容(包括 ssh-ed25519 和邮箱)
  6. Add SSH key

❌ 错误示例:

  • 只粘贴中间那一长串(漏了算法和邮箱)
  • 手动换行(GitHub 会认为这是无效格式)

✅ 测试是否成功

ssh -T git@github.com

看到 Hi <username>! You've successfully authenticated... 就成了!


第 4 章:多账号共存?SSH Config 来救场!

一人分饰两角,全靠幕后调度。” ——《戏梦人生》
工作用公司邮箱,业余搞开源用个人账号?SSH Config 就是你的“身份调度员”。

如果你同时有:

  • 公司 GitLab(work@company.com
  • 个人 GitHub(me@gmail.com

默认 SSH 会用 ~/.ssh/id_ed25519,导致提交记录混用邮箱,甚至被公司审计抓包!

✅ 解决方案:创建专属密钥 + 配置别名

# 生成工作密钥
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_work

# 生成个人密钥(如果还没有)
ssh-keygen -t ed25519 -C "me@gmail.com" -f ~/.ssh/id_personal

然后编辑 ~/.ssh/config(没有就新建):

# 默认个人账号
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_personal

# 工作账号(用别名)
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work

🎯 使用方式

  • 克隆个人项目:
    git clone git@github.com:yourname/project.git
    
  • 克隆工作项目:
    git clone git@github-work:company/project.git  # 注意是 github-work!
    

这样,Git 会自动用对应密钥,提交邮箱也不会乱


第 5 章:实战 Demo —— 10 分钟搭建双 GitHub 账号开发环境

纸上得来终觉浅,绝知此事要躬行。” —— 陆游
现在,让我们把前面所有知识串起来,打造一个清爽、高效、无冲突的双账号开发环境!

🎯 目标

  • 个人项目用 me@gmail.com 提交
  • 工作项目用 work@company.com 提交
  • 两个账号互不干扰,git push 一次成功

步骤 1:生成两对密钥

# 个人密钥
ssh-keygen -t ed25519 -C "me@gmail.com" -f ~/.ssh/id_personal

# 工作密钥
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_work

回车跳过 passphrase(或按需设置)


步骤 2:添加到 ssh-agent

eval $(ssh-agent -s)
ssh-add ~/.ssh/id_personal
ssh-add ~/.ssh/id_work

验证:

ssh-add -l  # 应看到两个密钥

步骤 3:配置 ~/.ssh/config

cat > ~/.ssh/config <<EOF
# Personal GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_personal

# Work GitHub (via alias)
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_work
EOF

步骤 4:将公钥添加到 GitHub

# 复制个人公钥
cat ~/.ssh/id_personal.pub
# → 粘贴到 GitHub Settings → SSH Keys,Title 填 "Personal Laptop"

# 复制工作公钥
cat ~/.ssh/id_work.pub
# → 粘贴到 GitHub(或公司 GitLab),Title 填 "Work Laptop"

步骤 5:测试 & 使用

# 测试个人账号
ssh -T git@github.com

# 测试工作账号
ssh -T git@github-work

# 克隆项目
git clone git@github.com:me/awesome-project.git      # 个人
git clone git@github-work:company/internal-tool.git  # 工作

# 进入项目后,设置本地用户(避免全局污染)
cd awesome-project
git config user.email "me@gmail.com"
git config user.name "My Name"

cd internal-tool
git config user.email "work@company.com"
git config user.name "Work Name"

大功告成!从此:

  • git push 不再卡在认证
  • 提交记录干净清晰
  • 深夜加班不再因“Permission denied”砸键盘!

🎉 结语

SSH 密钥看似简单,却是开发者每日必经的“第一道门”。
配得好,一日千里;配不好,寸步难行

希望这篇“避坑实战指南”能帮你彻底告别 Permission denied 的噩梦。
转发给那个还在手动输密码的同事吧——他欠你一杯咖啡 ☕。

作者:一位曾因 SSH 问题通宵的 Linux 老兵
首发于 CSDN,转载请注明出处


互动彩蛋
你在 SSH 配置中踩过什么奇葩坑?评论区聊聊,点赞最高的送《Git 高效开发秘籍》电子书一份!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐