我尝试通过SSH在Node中运行Git命令,但是一直出现错误:
权限被拒绝(公钥)
我猜测这是因为Node没有访问我的SSH密钥,因为它正在子进程中运行?
我该如何解决这个问题?
从Node中运行Bash脚本。
"scripts": {
"start": "npm-run-all -p server update",
"server": "dyson rest 7070",
"update": "sh update.sh"
}
update.sh
的内容如下:
#!/usr/bin/env bash
set -e
set -o pipefail
SSH_KEY=/path/.ssh/id_rsa
function update {
eval $(ssh-agent -s)
ssh-add ${SSH_KEY}
git submodule update --recursive --remote
}
update
重要的是在 Node 中启动 ssh-agent
,然后在运行 git
命令之前将您的 ssh 密钥添加到代理中。
更新:上面的方法可行,但我发现了更好的答案。失败的原因是因为在执行脚本内部时,HOME 环境变量并未指向与脚本外部相同的 HOME。我通过将我的 ssh 密钥放入两个 HOME 文件夹中来解决这个问题。然后脚本就能找到正确的密钥,万事大吉。
PS 您可以通过记录 process.env.HOME
在 Node 中确定 HOME 变量的值,或者使用 echo "${HOME}"
在 shell 脚本中确定它的值。
require('child_process').spawn('git', ['push', 'origin', 'master']);
在我的情况下,无论是使用ssh还是https,它都可以正常工作。