为何直接以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
相关产品推荐
相关产品推荐

