You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何直接以tom用户执行git pull正常,使用sudo -u tom执行却出现公钥权限拒绝?

为什么直接执行git pull正常,但sudo -u tom git pull会出现SSH公钥权限拒绝错误?

问题场景

我用户名是tom,执行$ whoami返回tom后,直接运行$ git pull一切正常;但执行$ sudo -u tom git pull时,却弹出错误:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

明明都是以tom用户身份执行,为什么表现完全不一样?

原因分析

这是因为sudo默认会重置绝大多数环境变量,包括SSH认证关键的SSH_AUTH_SOCK变量。这个变量指向SSH代理的套接字路径,Git通过它来获取你加载到代理里的私钥进行认证。

直接执行git pull时,你当前的shell环境保留了所有必要的环境变量,SSH代理能正常配合Git完成认证;但用sudo -u tom执行时,sudo会启动一个“干净”的tom用户环境,丢失了SSH_AUTH_SOCK这类关键变量,Git找不到可用的私钥,自然就触发权限拒绝错误了。

解决方案

只要让sudo保留原有的环境变量(尤其是SSH代理相关的)就行,加上-E参数即可:

sudo -u tom -E git pull

-E选项的作用是告诉sudo:保留当前用户的环境变量,不要重置它们。这样tom用户的进程就能拿到SSH代理的认证信息,Git拉取就正常了。

内容的提问来源于stack exchange,提问作者T. Kau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:22:29