那次我跟 SSH 杠上了——记一次 Git 推送的血泪史
那次我跟 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:
- 打开
https://github.com/settings/tokens - 点 “Generate new token”
- 权限勾上
repo和workflow - 复制 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! 代码终于传上去了!
经验教训总结
-
SSH vs HTTPS:
- SSH:需要配置密钥,但一次配置终身受益
- HTTPS:需要 token,但不容易被防火墙拦截
-
那个 libselinux 警告:
/lib64/libselinux.so.1: no version information available这玩意儿只是个警告,不是错误!不影响 Git 功能。是系统库版本不匹配,但能凑合用。
-
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 不香吗?
更多推荐




所有评论(0)