树莓派带sudo运行git自动推送脚本出现public key权限报错如何解决?
问题原因
核心是sudo切换运行身份后,SSH密钥读取路径不匹配:
- 你日常操作和不加sudo运行脚本时,身份是默认的
pi用户,SSH密钥默认存放在/home/pi/.ssh/目录下,git调用SSH时会自动读取该路径下的私钥完成鉴权,因此运行正常。 - 加sudo运行脚本时,脚本的实际运行身份变成了
root用户,root用户的家目录为/root,git调用SSH时会默认读取/root/.ssh/路径下的私钥,你之前生成的SSH密钥仅存放在pi用户目录下,root用户没有对应的鉴权凭证,因此报Permission denied(public key)错误。 - 你单独在终端执行push操作正常,也是因为操作身份是pi用户,和密钥本身有效性无关。
解决方案
你可以根据自己的使用场景选择以下任意一种方法:
- 运行脚本时保留当前用户环境
执行命令时添加-E参数保留当前用户的环境变量:
sudo -E bash measurement.sh
如果你的sudo配置默认禁止保留HOME变量,可以直接在autoupdate.sh的git push命令中强制指定私钥路径:
git add -A && git commit -m "$1: Update files" && git -c core.sshCommand="ssh -i /home/pi/.ssh/id_rsa" push origin main
- 给root用户配置对应SSH密钥
直接将pi用户的SSH密钥复制到root用户的配置目录并修改对应权限:
sudo cp /home/pi/.ssh/id_rsa* /root/.ssh/ sudo chown root:root /root/.ssh/id_rsa* sudo chmod 600 /root/.ssh/id_rsa
注意该方法存在一定安全风险,相当于root用户也拥有了你Git仓库的读写权限,请按需选择。
3. 拆分脚本权限
如果仅脚本中部分操作需要root权限,仅给对应操作添加sudo前缀,整个脚本用普通pi用户运行,无需给整个脚本加sudo,安全性最高。
内容的提问来源于stack exchange,提问作者CoffeePlease
相关产品推荐
相关产品推荐

