7
  # Write the SSH-KEY to the disk
  fs.writeFile "/cgrepos/.ssh/#{repo.id}.pub", repo.public_key, (err) ->
    throw err if err

    fs.writeFile "/cgrepos/.ssh/#{repo.id}", repo.private_key, (err) ->
      throw err if err

      exec "chmod 400 /cgrepos/.ssh/#{repo.id} && eval `ssh-agent -s` && ssh-add /cgrepos/.ssh/#{repo.id}", (error) ->
        throw error if error
        # First, delete the git repo on the hard drive, if it exists
        exec "rm -rf #{git_location}", options, (error) ->
          throw error if error
          # Second, clone the repo into the location
          console.log "Cloning repo #{repo.id}: #{repo.repo_name} into #{git_location}. This could take a minute"
          exec "git clone #{repo.url} #{git_location}", options, (error) ->
            throw error if error

我正在节点中尝试(coffee用于那些很棒的)。但是由于某种原因,当它运行时,它给了我一个错误:Error: Command failed: conq: repository access denied. deployment key is not associated with the requested repository.

不知道我做错了什么。如果我直接从命令行运行这些命令,一切似乎都正常。有任何想法吗?

4

1 回答 1

4

当您尝试git clone从 node.js 执行进程时,它会在不同的环境中运行。

当您git clone在受保护的(基于 ssh 协议的)存储库上使用时,ssh-agent首先尝试使用提供的公钥对您进行身份验证。由于exec每次调用使用不同的运行时环境,即使您明确添加私钥,由于运行时环境不同,它也不会起作用。

在 ssh 中进行身份验证时,git clone 会查找SSH_AUTH_SOCK. 通常,此环境变量具有您的密码密钥环服务的路径,例如(gnome-keyring 或 kde-wallet)。

试试这个先检查一下。

env | grep -i ssh

它应该列出 SSH_AGENT_PID 和 SSH_AUTH_SOCK。问题是在运行git clone这些环境变量时没有设置。因此,您可以将它们设置为 exec 函数调用中的选项(只需 SSH_AUTH_SOCK 就足够了)。在这里查看如何将 env 密钥对传递给 exec。

var exec = require('child_process').exec,
    child;

child = exec('git clone cloneurl', {
  cwd: cwdhere,      // working dir path for git clone
  env: {
           envVar1: envVarValue1,
           SSH_AUTH_SOCK: socketPathHere
       } 
}, callback);

如果这不起作用,请尝试ssh -vvv user@git-repo-host在 exec 函数中执行。查看此过程的输出,您会发现错误。

如果错误显示debug1: No more authentication methods to try. Permission denied (publickey).,然后像这样将主机别名添加到 $HOME/.ssh/config 文件。

Host hostalias
 Hostname git-repo-host
 IdentityFile ~/.ssh/your_private_key_path

这将对指定主机的所有身份验证请求使用提供的私钥。在此选项中,您还可以更改您的origin'surl 以使用上面文件中配置的 hostalias。 reporoot/.git/config文件将如下所示。

[remote "origin"]
    url = user@hostalias:repo.git
于 2013-04-07T11:23:40.513 回答