You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

PM2启动Node.js服务无法访问SSH密钥,Git权限被拒求助

PM2启动Node.js服务时Git SSH权限被拒绝的解决方案

这个问题我碰到过好几次,核心原因就是PM2运行时的用户环境和你直接用node index.js的环境不一样——你手动启动时用的是当前登录用户的身份,会自动加载~/.ssh下的密钥,但PM2可能以root用户运行,或者没加载到你的用户环境变量,导致找不到密钥文件。下面给你几个靠谱的解决办法:

方法1:用你的普通用户身份启动PM2

如果你的SSH密钥存在普通用户(比如ubuntu)的~/.ssh目录下,但你之前是用root启动PM2,那肯定访问不到。切换到你的普通用户,或者用sudo -u指定用户启动:

sudo -u 你的用户名 pm2 start index.js

比如你的用户名是alex,就执行sudo -u alex pm2 start index.js。这样PM2就会以你的用户身份运行,自然能访问到~/.ssh里的密钥。

方法2:给PM2配置环境变量,指定密钥路径

你可以通过PM2的配置文件或者启动命令,强制指定用户主目录和SSH套接字路径。先创建一个ecosystem.config.js配置文件:

module.exports = {
  apps : [{
    name: '你的服务名称',
    script: 'index.js',
    env: {
      HOME: '/home/你的用户名', // 替换成你的用户主目录,比如/home/alex
      SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh' // 这个路径可以在你当前用户下执行echo $SSH_AUTH_SOCK获取
    }
  }]
};

然后用这个配置文件启动服务:

pm2 start ecosystem.config.js

嫌麻烦的话也可以直接在启动命令里加参数:

pm2 start index.js --env HOME=/home/你的用户名 --env SSH_AUTH_SOCK=你的SSH套接字路径

方法3:检查SSH密钥的权限设置

有时候密钥文件权限太宽松也会被SSH拒绝,先确保权限是安全的:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/id_rsa.pub

设置完后重启PM2服务:

pm2 restart all

方法4:修改PM2服务的运行用户(如果PM2是系统服务)

如果你的PM2是作为systemd服务运行的,得修改它的配置文件。找到/etc/systemd/system/pm2-你的用户名.service,编辑里面的User字段:

[Service]
User=你的用户名

然后重新加载配置并重启PM2:

sudo systemctl daemon-reload
sudo systemctl restart pm2-你的用户名

最后可以用pm2 logs查看服务日志,确认权限问题是否解决。如果还是不行,建议在你的Node.js代码里加一行console.log('HOME:', process.env.HOME, 'SSH_AUTH_SOCK:', process.env.SSH_AUTH_SOCK),看看PM2运行时的环境变量是不是和你手动启动时一致。

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

火山引擎 最新活动