代码之家  ›  专栏  ›  技术社区  ›  Shamoon

无法通过在Node.js中添加ssh密钥来进行git克隆

  •  7
  • Shamoon  · 技术社区  · 11 年前
      # 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.

    不确定我做错了什么。如果我直接从命令行运行这些命令,一切似乎都很好。有什么想法吗?

    1 回复  |  直到 11 年前
        1
  •  4
  •   smitrp    11 年前

    当你试图执行 git clone 进程,它在不同的环境中运行。

    当您使用 git克隆 在受保护的(基于ssh协议的)存储库上, ssh-agent 首先尝试使用提供的公钥对您进行身份验证。自从 exec 对每个调用使用不同的运行时环境,即使显式添加私钥,由于运行时环境不同,它也无法工作。

    在ssh中进行身份验证时,git-clone会查找 SSH_AUTH_SOCK 一般来说,这个env变量有你的密码密钥环服务的路径,比如(gnome密钥环或kde钱包)。

    试着先检查一下。

    env | grep -i ssh
    

    它应该列出SSH_AGENT_PID和SSH_AUTH_SOCK。问题出在运行时 git克隆 这些环境变量没有设置。因此,您可以在exec函数调用中将它们设置为选项(仅SSH_AUTH_SOCK就足够了)。看 here 关于如何将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's 使用上面文件中配置的主机别名的url。 reporoot/.git/config 文件将如下所示。

    [remote "origin"]
        url = user@hostalias:repo.git