如何配置Linux服务器以正常连接GitHub仓库拉取代码?
核心故障原因
你执行sudo git pull origin master报权限错误的核心原因非常明确:sudo执行命令时会切换身份到root用户,此时SSH认证读取的是root用户家目录下的密钥配置,和你当前登录的非root用户~/.ssh目录下的文件完全无关。你之前给GitHub账号添加的是当前普通用户的密钥,root用户读不到,自然会认证失败。
另外两个你之前操作没生效的常见原因:
- 你之前添加到GitHub的是
id_rsa私钥文件内容,GitHub只接受.pub后缀的公钥用于SSH认证,上传私钥完全无效。 - 本地仓库的远程地址配置成了HTTPS格式,根本没走SSH认证通道。
把部署服务器的SSH密钥加到个人GitHub账号可以临时解决问题,但不属于规范操作——后续如果你的账号权限被调整、人员离职,部署流程会直接失效,长期使用推荐配置仓库级的部署密钥。
操作步骤(优先选无sudo方案,安全且易维护)
方案一:普通用户直接拉取(推荐)
不需要用sudo执行git操作,只要给当前用户配置代码目录权限、正确设置SSH密钥即可:
- 修复代码目录权限
如果你之前用sudo拉过代码,代码目录的属主会是root,普通用户没有写入权限,执行以下命令修复(把/your/site/path替换成实际的网站代码根目录路径):sudo chown -R $USER:$USER /your/site/path - 配置正确的SSH公钥
- 执行
cat ~/.ssh/id_rsa.pub,复制输出的全部公钥内容(如果文件不存在,执行ssh-keygen -t ed25519 -C "server-deploy"一路回车生成即可) - 打开GitHub对应仓库的设置页,找到「Deploy keys」选项,添加刚才复制的公钥,仅拉取代码不需要勾选写权限;如果临时应急,也可以把公钥加到你个人GitHub账号的SSH密钥列表中,确保你的账号有仓库访问权限即可。
- 执行
- 验证配置有效性
- 先验证SSH连通性,执行:
如果返回类似ssh -T git@github.comHi xxx! You've successfully authenticated, but GitHub does not provide shell access.的提示,说明SSH认证已经正常。 - 检查仓库远程地址格式,在代码目录执行
git remote -v,如果返回的地址是https://github.com/xxx/xxx.git开头,说明是HTTPS地址,执行命令替换为SSH地址:git remote set-url origin git@github.com:仓库所属用户名/仓库名.git
- 先验证SSH连通性,执行:
- 直接在代码目录执行
git pull origin master即可,不需要加sudo。
方案二:必须使用sudo执行的场景(不推荐)
如果因为特殊环境限制必须加sudo执行git命令,就给root用户单独配置SSH密钥:
- 执行
sudo su切换到root用户 - 执行
ssh-keygen -t ed25519 -C "root-deploy-key"一路回车生成root用户的SSH密钥 - 执行
cat ~/.ssh/id_ed25519.pub复制公钥,按照方案一的步骤添加到GitHub对应仓库的部署密钥中 - 执行
exit退回普通用户,再执行sudo git pull origin master即可正常拉取。
注意事项
- 绝对不要把不带
.pub后缀的私钥文件内容上传到任何平台,私钥仅保存在服务器本地即可,泄露会有严重安全风险。 - 每次配完密钥先跑
ssh -T git@github.com验证连通性,不要直接执行git pull,能快速定位是密钥问题还是git配置问题。
内容的提问来源于stack exchange,提问作者Samson Daniel
相关产品推荐
相关产品推荐

