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

Google Cloud Compute Engine启动脚本拉取Git仓库遇公钥权限拒绝求助

解决GCE启动脚本Git拉取权限拒绝问题

我遇到过几乎一模一样的问题,这种开机自动脚本的权限坑确实容易踩,咱们一步步来排查解决:

核心原因:启动脚本的运行用户和你手动操作的用户不一样

Google Cloud Compute Engine的启动脚本默认是以root用户身份运行的,而你手动执行脚本时用的是自己的普通用户账号。你添加的GitLab部署密钥是存在普通用户的~/.ssh目录下的,root用户根本找不到这个密钥,自然会报permission denied (public key)的错误。

解决方案1:切换到你的普通用户执行脚本

修改启动脚本,用su命令切换到你的日常开发用户来执行所有命令,这样就能用到你已经配置好的部署密钥了:

#! /bin/bash
# 替换成你的普通用户名,比如"imre"
su - imre -c "
cd /to/my/server/folder
git pull
npm install --no-progress
nohup node src/ &
"

注意:这里去掉了sudo npm install,因为切换到普通用户后,如果你的项目目录权限是该用户的,就不需要sudo了;如果确实需要全局安装依赖,再加上sudo即可。

解决方案2:给root用户配置部署密钥

如果你不想切换用户,也可以把部署密钥复制到root用户的.ssh目录,并设置严格的权限(SSH对密钥文件权限要求非常苛刻):

  1. 复制密钥文件:
sudo cp ~/.ssh/id_rsa /root/.ssh/
sudo cp ~/.ssh/id_rsa.pub /root/.ssh/
  1. 设置正确权限:
sudo chmod 700 /root/.ssh
sudo chmod 600 /root/.ssh/id_rsa
sudo chmod 644 /root/.ssh/id_rsa.pub
  1. 提前确认GitLab主机密钥:
    用root用户手动执行一次git pull,按提示确认连接(输入yes),这样root的~/.ssh/known_hosts就会自动添加GitLab的主机信息,避免脚本运行时因为交互提示失败。

解决方案3:在脚本中指定SSH密钥路径

如果上面两种方法都不想用,还可以在Git命令里直接指定密钥路径,不管哪个用户运行都能找到密钥:

  1. 把部署密钥放到一个全局可访问的路径(比如/opt/deploy_key):
sudo cp ~/.ssh/id_rsa /opt/deploy_key
sudo chmod 600 /opt/deploy_key
  1. 修改启动脚本:
#! /bin/bash
cd /to/my/server/folder
# 指定密钥路径,同时跳过主机密钥确认(生产环境建议提前配置known_hosts)
GIT_SSH_COMMAND="ssh -i /opt/deploy_key -o StrictHostKeyChecking=no" git pull
sudo npm install --no-progress
nohup node src/ &

排查技巧:查看启动脚本日志

如果还是有问题,可以查看GCE的启动脚本日志,里面有详细的错误输出:

cat /var/log/google-startup-scripts.log

日志会告诉你到底是密钥找不到、权限不对,还是其他问题,帮你快速定位。

内容的提问来源于stack exchange,提问作者Imre_G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:18:31