2013-03-21 11 views
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.Node.jsにssh-keyを追加してクローンを作成することはできません

私が間違っていることがわかりません。これらのコマンドをコマンドラインから直接実行すると、すべて正常に動作しているようです。何か案は?

+0

これを 'ssh'で直接再生してみましたか?gitを式から外しましたか? Bitbucketのサーバから何か有用なものは得られませんが(エラーメッセージから私が使用しているものと仮定します)、 "gitまたはhgを使用してBitbucketに接続できます。シェルアクセスは無効になっています。それが動作すれば;それがうまくいかない場合は、 'ssh -v'でデバッグを試みることができます。 –

+0

もう一つの試みは、 'exec ssh -v" $ @ "'を実行するラッパーシェルスクリプトを作成し、gitが冗長モードでSSHを実行するように 'GIT_SSH'環境変数を設定することです。そうすれば、 'git'がSSHをどのように動かしているかを知ることができ、それはあなたにいくつかの手がかりを与えるかもしれません。 –

答えて

4

node.jsからgit cloneプロセスを実行しようとすると、別の環境で実行されます。

git cloneを保護された(on sshプロトコルの)リポジトリで使用すると、ssh-agentは最初に提供された公開鍵であなたを認証しようとします。 execは、呼び出しごとに異なる実行時環境を使用するため、秘密鍵を明示的に追加しても、異なる実行時環境のために機能しません。

sshで認証するとき、gitクローンはSSH_AUTH_SOCKを探します。一般的にこのenv変数には、(gnome-keyringやkde-walletのような)パスワードキーリングサービスのパスがあります。

最初に確認してください。

env | grep -i ssh 

SSH_AGENT_PIDとSSH_AUTH_SOCKをリストする必要があります。問題は、git cloneこれらの環境変数を実行していないときです。したがって、exec関数呼び出しのオプションとしてそれらを設定できます(SSH_AUTH_SOCKだけで十分です)。 execにenv鍵ペアを渡す方法については、hereを参照してください。

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); 

これが機能しない場合は、exec機能でssh -vvv [email protected]を実行してみてください。このプロセスの出力を参照してください。エラーが見つかります。

エラーが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を上記のファイルで設定されたhostaliasを使用するように変更することもできます。 reporoot/.git/configファイルは次のようになります。

[remote "origin"] 
    url = [email protected]:repo.git 
+0

私は所有していないか制御している何千ものreposのためにこれをプログラム的に実行しようとしています。私は 'ssh'キーを生成し、ユーザーはそれらを展開キーに追加します。だから私はこれがうまくいくかどうかわからない – Shamoon

+0

その場合、hostaliasの方法は適用されません。しかし、そのプロセスのための適切な環境を設定しようとする必要があります。 – smitrp

関連する問題