那次我跟 SSH 杠上了——记一次 Git 推送的血泪史

背景:我想把我的代码传上 GitHub

那天我写了个网络设备驱动,准备推送到 Netmiko 项目。本以为是 git push 一下的事,结果……故事就这么开始了。

第一回合:SSH 给我来了个下马威

[root@k8s-122 gamepad]# git push -u origin main
/usr/bin/ssh: /lib64/libselinux.so.1: no version information available
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

翻译成人话:SSH 说“你谁啊?我不认识你!”

我心里嘀咕:不对啊,我明明配置了 SSH 密钥的。赶紧检查:

# 检查 SSH 密钥
ssh-add -l
# 检查远程地址
git remote -v

结果发现——远程地址确实是 SSH 格式的(git@github.com:...),但系统就是连接不上。

第二回合:诊断时间

我寻思着,可能是网络问题?公司防火墙?代理设置?于是开始排查:

# 测试 GitHub 连通性
ping github.com
# 测试 SSH 端口
nc -zv github.com 22

咦,能通啊!那为什么 SSH 连接失败?

然后我用了大招——开启 SSH 详细调试:

ssh -Tvvv git@github.com

看到一堆握手失败的信息,瞬间明白:公司的防火墙把 SSH 给拦截了!虽然 22 端口能通,但 SSH 协议被深度检测给干掉了。

第三回合:换个思路——用 HTTPS 呗

既然 SSH 走不通,那就换条路。我决定用 HTTPS 方式:

# 1. 先把原来的 SSH 地址删了
git remote remove origin

# 2. 换成 HTTPS 地址
git remote add origin https://github.com/longsongline/gamepad_mapper.git

# 3. 再推一次
git push -u origin main

第四回合:HTTPS 要我“交保护费”

这次 SSH 的报错没了,但又来了新问题:

Username for 'https://github.com': 
Password for 'https://github.com':

这里有个大坑:GitHub 从 2021 年起就不支持用密码登录了!得用 Personal Access Token(PAT)。

于是我去 GitHub 生成了个 token:

  1. 打开 https://github.com/settings/tokens
  2. 点 “Generate new token”
  3. 权限勾上 repoworkflow
  4. 复制 token(注意:这玩意儿只显示一次,丢了就得重来)

第五回合:终于成功了!

输入用户名,粘贴 token 当密码:

Enumerating objects: 96, done.
Counting objects: 100% (96/96), done.
Delta compression using up to 40 threads
Compressing objects: 100% (93/93), done.
Writing objects: 100% (96/96), 13.96 MiB | 4.41 MiB/s, done.
Total 96 (delta 33), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (33/33), done.
To https://github.com/longsongline/gamepad_mapper.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

Bingo! 代码终于传上去了!

经验教训总结

  1. SSH vs HTTPS

    • SSH:需要配置密钥,但一次配置终身受益
    • HTTPS:需要 token,但不容易被防火墙拦截
  2. 那个 libselinux 警告

    /lib64/libselinux.so.1: no version information available
    

    这玩意儿只是个警告,不是错误!不影响 Git 功能。是系统库版本不匹配,但能凑合用。

  3. GitHub token 小贴士

    • token 生成后马上保存到密码管理器
    • 可以用 git config credential.helper store 让 Git 记住凭据
    • token 有有效期,记得及时续期

如果再来一次,我会……

直接上 HTTPS,别跟 SSH 死磕:

# 新建仓库时就用 HTTPS
git clone https://github.com/用户名/仓库名.git

# 或者现有仓库切换
git remote set-url origin https://github.com/用户名/仓库名.git

最后的最后

这次折腾让我明白:有时候最简单的方法就是最好用的方法。SSH 看起来高大上,但在企业网络环境下,HTTPS 往往更靠谱。

血泪教训:看到 Permission denied (publickey),别急着怀疑人生,先试试 HTTPS。十有八九能解决问题!


后记:后来我发现,其实 SSH 在公司内网也能用,但得找 IT 开白名单。不过……何必呢?HTTPS 不香吗?

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐