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对密钥文件权限要求非常苛刻):
- 复制密钥文件:
sudo cp ~/.ssh/id_rsa /root/.ssh/ sudo cp ~/.ssh/id_rsa.pub /root/.ssh/
- 设置正确权限:
sudo chmod 700 /root/.ssh sudo chmod 600 /root/.ssh/id_rsa sudo chmod 644 /root/.ssh/id_rsa.pub
- 提前确认GitLab主机密钥:
用root用户手动执行一次git pull,按提示确认连接(输入yes),这样root的~/.ssh/known_hosts就会自动添加GitLab的主机信息,避免脚本运行时因为交互提示失败。
解决方案3:在脚本中指定SSH密钥路径
如果上面两种方法都不想用,还可以在Git命令里直接指定密钥路径,不管哪个用户运行都能找到密钥:
- 把部署密钥放到一个全局可访问的路径(比如
/opt/deploy_key):
sudo cp ~/.ssh/id_rsa /opt/deploy_key sudo chmod 600 /opt/deploy_key
- 修改启动脚本:
#! /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
相关产品推荐
相关产品推荐

