在之前的 Git 仓库操作中,我先后遇到了「403 权限拒绝」「SSH 22 端口超时」「认证主机提示」等问题,最终通过 SSH 配置解决了所有推送障碍。本文将聚焦 SSH 相关技术点,复盘 "为什么要配置 SSH""如何一步步配置""遇到问题怎么解决",形成可直接复用的操作手册,方便后续遇到同类问题时快速参考。
一、核心疑问:为什么一定要配置 SSH?
在尝试用 HTTPS 方式推送代码时,反复出现 remote: Permission to myAccount/MSE_for_TAD-hb.git denied to myAccount(403 权限错误),即使输入正确账号也无法解决。而 SSH 配置能从根本上解决这些问题,核心原因有 3 点:
1. 避开 HTTPS 凭证的 "坑"
-
GitHub 早在 2021 年就弃用了 "账号 + 密码" 的 HTTPS 登录方式,必须用「个人访问令牌(PAT)」替代,但我在操作中多次因 "凭证缓存过期""PAT 权限不全" 报错;
-
SSH 通过「密钥对」认证(本地私钥 + GitHub 公钥),无需每次输入账号密码,也不存在 "凭证过期" 问题,一次配置终身免密。
2. 解决国内网络 "22 端口拦截" 问题
我执行 git push 时多次遇到 ssh: connect to host ``github.com`` port 22: Connection timed out,这是国内网络常见问题 ------ 多数网络环境会拦截 SSH 默认的 22 端口,而配置 SSH 时可指定走 443 端口(HTTPS 默认端口,几乎不被拦截),直接绕开网络限制。
3. 更安全的身份认证
-
HTTPS 凭证(PAT)若不慎泄露,攻击者可直接操作我的仓库;
-
SSH 采用 "非对称加密":本地私钥仅保存在我的电脑,GitHub 仅存储公钥,即使公钥泄露,没有私钥也无法认证,安全性更高。
二、SSH 配置全流程(复盘我的操作轨迹,每步对应问题)
我的 SSH 配置过程曾因「.ssh 目录不存在」「端口未指定」「公钥未添加」等卡壳,以下是修正后的完整流程,每步都标注了 "对话场景呼应",帮我回忆当时的操作细节:
步骤 1:创建.ssh 目录(解决 "cd ~/.ssh: No such file or directory")
我最初执行 cd ~/.ssh 时报错 "目录不存在",需先创建目录(默认路径:C:\Users\我的用户名\.ssh):
进入gitbash界面,依次执行以下命令:
\# 1. 进入用户根目录(Windows下\~对应C:\Users\我的用户名)
cd \~
\# 2. 创建.ssh目录(若已存在则忽略)
mkdir .ssh
\# 3. 进入.ssh目录(后续操作都在此目录下)
cd .ssh
\# 验证:执行pwd,输出应类似 /c/Users/HB/.ssh(HB是我的用户名)
pwd
步骤 2:生成 SSH 密钥对(核心:用于 GitHub 认证)
我需要生成「ed25519 类型」密钥(比传统 RSA 更安全、密钥更小),命令中邮箱需用我 GitHub 注册的邮箱:
\# 生成ed25519密钥,-C后接邮箱(备注作用,方便区分设备)
ssh-keygen -t ed25519 -C "注册github使用的邮箱@xxx.com"
执行后会出现 3 次提示,全程按回车键(无需设置密码,简化后续操作):
-
提示 1:
Enter file in which to save the key (/c/Users//.ssh/id_ed25519):→ 回车(默认路径); -
提示 2:
Enter passphrase (empty for no passphrase):→ 回车(无密码); -
提示 3:
Enter same passphrase again:→ 回车(确认无密码)。
生成结果验证:
执行后在 .ssh 目录下会生成两个文件:
-
id_ed25519:本地私钥(绝对不能泄露,不要上传到仓库); -
id_ed25519.pub:公钥(需要上传到 GitHub,用于身份匹配)。
步骤 3:配置 SSH 走 443 端口(解决 "22 端口超时")
这是解决我「SSH 连接超时」的关键步骤 ------ 通过配置文件强制 SSH 连接 GitHub 时走 443 端口,避开 22 端口拦截:
\# 在.ssh目录下创建config文件(无后缀),写入端口配置
echo -e "Host github.com\n Hostname ssh.github.com\n Port 443\n User git\n IdentityFile \~/.ssh/id\_ed25519" > config
\# 验证配置内容(确保无拼写错误)
cat config
配置参数解读(对应我的场景):
-
Host ``github.com:对 "github.com" 这个域名生效; -
Hostname ``ssh.github.com:GitHub 的 SSH 专用域名(固定值); -
Port 443:指定连接端口为 443(解决 22 端口超时); -
User git:SSH 连接 GitHub 的固定用户名(必须是 git,不能改); -
IdentityFile ~/.ssh/id_ed25519:指定使用刚才生成的私钥(路径要正确)。
步骤 4:将公钥添加到 GitHub(解决 "权限认证失败")
SSH 认证的核心是 "GitHub 存储的公钥" 与 "我本地的私钥" 匹配,因此需要将 id_ed25519.pub 中的内容添加到 GitHub:
步骤 4.1:复制公钥内容
\# 读取公钥文件内容并复制(Windows下可直接全选输出结果,Ctrl+C复制)
cat id\_ed25519.pub
输出示例(需全选复制以 ssh-ed25519 开头的整行):
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxx我的公钥内容xxxxxxxxxxxxxx HB@BEN-WIN
步骤 4.2:在 GitHub 中添加公钥
-
登录我的 GitHub 账号(
myAccount),点击右上角头像 → 选择「Settings」; -
在左侧菜单找到「SSH and GPG keys」→ 点击「New SSH key」;
-
填写两个核心字段:
-
「Title」:填备注(如 "BEN-WIN 电脑",方便区分多台设备);
-
「Key」:粘贴刚才复制的公钥内容(确保无多余空格 / 换行);
- 点击「Add SSH key」完成添加(若弹出账号验证,输入 GitHub 密码即可)。
步骤 5:测试 SSH 连接(验证配置是否成功)
这是 "临门一脚",需确认 SSH 能正常连通 GitHub,对应我之前遇到的「The authenticity of host」提示:
\# 测试SSH连接GitHub(-T表示“不打开终端,仅测试认证”)
ssh -T git@github.com
场景 1:首次连接(出现主机认证提示)
我首次执行时会看到以下提示,这是 SSH 的安全验证(确认连接的是真实 GitHub 服务器):
The authenticity of host '\[ssh.github.com]:443 (\[20.205.243.160]:443)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/\[fingerprint])?
-
操作 :输入小写
yes(必须小写,不能输 Y/YES),回车; -
原理 :GitHub 官方公开的 ED25519 指纹就是
SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU,确认匹配即可安全连接。
场景 2:连接成功(核心验证结果)
若输出以下内容,说明 SSH 配置完全成功,我的身份已通过 GitHub 认证:
Warning: Permanently added '\[ssh.github.com]:443,\[20.205.243.160]:443' (ED25519) to the list of known hosts.
Hi myAccount! You've successfully authenticated, but GitHub does not provide shell access.
- 关键信息:
Hi myAccount! You've successfully authenticated(认证成功)。
三、SSH 配置后的后续操作(复盘我的推送流程)
SSH 配置成功后,还需关联仓库并解决「分支落后」问题,才能顺利推送代码,对应我最后遇到的 non-fast-forward 报错:
步骤 1:关联 GitHub 仓库(替换 HTTPS 地址为 SSH)
我之前的远程地址是 HTTPS 格式,需替换为 SSH 地址(避免混用导致报错):
\# 1. 进入我的项目目录(替换为实际路径)
cd /d/Code/DeepLearning/TAL/MSE\_for\_TAD/MSE\_for\_TAD-hb
\# 2. 查看当前远程地址(确认是HTTPS格式)
git remote -v
\# 3. 删除旧的HTTPS远程地址(默认远程名为origin)
git remote rm origin
\# 4. 添加新的SSH远程地址(替换为我的仓库SSH地址)
\# 仓库SSH地址获取:GitHub仓库页面 → Code → SSH → 复制
git remote add origin git@github.com:myAccount/MSE\_for\_TAD-hb.git
\# 5. 验证远程地址(输出应为SSH格式)
git remote -v
步骤 2:拉取远程分支(解决 "non-fast-forward" 分支落后)
我推送时曾报错 Updates were rejected because the tip of your current branch is behind,原因是 "本地分支落后于远程(如远程有 README 文件,本地没有)",需先拉取对齐:
\# 拉取远程master分支,--allow-unrelated-histories解决“历史无关”问题
\# -X theirs自动用远程内容覆盖本地冲突(如README文件)
git pull origin master --allow-unrelated-histories -X theirs
步骤 3:最终推送代码(免密成功)
拉取对齐后,执行推送命令,此时已无需输入账号密码,直接免密推送:
\# -u 绑定本地master分支与远程master分支(仅首次推送需要)
git push -u origin master
推送成功的输出示例:
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 32 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 580 bytes | 580.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:myAccount/MSE\_for\_TAD-hb.git
  a1b2c3d..d4e5f6g master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
四、复盘关键:遇到 SSH 问题的排查流程(后续复用)
若后续再次遇到 SSH 相关报错,可按以下流程排查,覆盖我之前遇到的所有场景:
1. 先检查 SSH 连接是否正常
\# 核心命令:测试SSH连接
ssh -T git@github.com
\# 若输出“Hi 用户名!” → 连接正常;若超时/认证失败 → 进入下一步
2. 检查.ssh 配置文件
\# 查看config文件内容,确认443端口配置正确
cat \~/.ssh/config
\# 重点检查:Hostname是否为ssh.github.com、Port是否为443、IdentityFile路径是否正确
3. 检查公钥是否在 GitHub 中
- 登录 GitHub → Settings → SSH and GPG keys → 确认已添加的公钥 "Title" 与我的设备匹配,且公钥内容与
~/.ssh/id_ed25519.pub一致。
4. 检查远程地址是否为 SSH 格式
git remote -v
\# 输出应为 git@github.com:用户名/仓库名.git,而非https://开头
五、总结:SSH 配置的核心要点(复盘速记)
-
核心目的:解决 HTTPS 的 403 权限错误、22 端口超时,实现免密推送;
-
关键步骤:创建目录→生成密钥→配置 443 端口→添加公钥→测试连接→关联仓库→拉取推送;
-
避坑重点:
-
目录路径:
~/.ssh对应 Windows 的C:\Users\用户名\.ssh; -
端口配置:必须指定
Port 443,避开 22 端口拦截; -
认证提示:首次连接需输入小写
yes,而非 Y/YES; -
远程地址:必须替换为 SSH 格式,避免 HTTPS 与 SSH 混用。
通过以上流程,可在任何设备上复现 SSH 配置操作,快速解决 Git+GitHub 的推送问题,无需再反复排查权限或网络错误。
(注:文档部分内容可能由 AI 生成,注意甄别)