2013-03-21 10 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 

Lo sto provando nel nodo (usando coffee per quelli che sono fantastici). Ma per qualche ragione, quando funziona, mi dà un errore: Error: Command failed: conq: repository access denied. deployment key is not associated with the requested repository.Non posso clonare clonando ssh-key in Node.js

Non so cosa sto facendo male. Se eseguo direttamente questi comandi dalla riga di comando, tutto sembra funzionare correttamente. Qualche idea?

+0

Avete provato a riprodurlo direttamente con 'ssh', eliminando l'equazione? Anche se è improbabile che tu possa ottenere qualcosa di utile dal server di Bitbucket (dal messaggio di errore presumo che sia quello che stai usando) dovresti vedere "Puoi usare git o hg per connetterti a Bitbucket. L'accesso alla shell è disabilitato." se funziona; puoi provare 'ssh -v' per eseguire il debug se questo non funziona. –

+0

Un'altra cosa che potresti provare è creare uno script di shell wrapper che esegua 'exec ssh -v" $ @ "' e imposta la variabile di ambiente 'GIT_SSH' in modo che git esegua SSH in modalità dettagliata. Quindi puoi vedere come 'git' sta eseguendo SSH e questo potrebbe darti qualche indizio. –

risposta

4

Quando si tenta di eseguire il processo git clone da node.js, viene eseguito in un ambiente diverso.

Quando si utilizza git clone su repository protetto (su protocollo ssh), ssh-agent tenta prima di autenticarsi con la chiave pubblica fornita. Poiché exec utilizza un ambiente runtime diverso per ogni chiamata, anche se si aggiunge esplicitamente la propria chiave privata, non funzionerà a causa del diverso ambiente di runtime.

Durante l'autenticazione in ssh, git clone cerca SSH_AUTH_SOCK. Generalmente questa variabile env ha il percorso del tuo servizio di keyring della password come (gnome-keyring o kde-wallet).

Prova a controllarlo prima.

env | grep -i ssh 

Si dovrebbe elencare SSH_AGENT_PID e SSH_AUTH_SOCK. Il problema è quando si eseguono git clone queste variabili di ambiente non sono impostate. Quindi puoi impostarli (solo SSH_AUTH_SOCK è sufficiente) come opzioni nella chiamata alla funzione exec. Guarda here su come passare le coppie di chiavi env in 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); 

Se questo non funziona, provare ad eseguire ssh -vvv [email protected] nella funzione exec. Vedi l'output di questo processo, troverai l'errore.

Se l'errore indica debug1: No more authentication methods to try. Permission denied (publickey)., quindi aggiungere un alias host a $ HOME/.ssh/config file come questo.

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

Questo utilizzerà la chiave privata fornita per tutte le richieste di autenticazione all'host specificato. In questa opzione, puoi anche modificare l'url origin's per utilizzare le hostal configurate nel file sopra. reporoot/.git/config il file sarà simile a questo.

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

Sto provando a fare questo programmaticamente per potenzialmente migliaia di repository che non possiedo o controllo. Genero la chiave 'ssh' e i nostri utenti le aggiungeranno alla chiave di distribuzione. Quindi non sono sicuro se questo funzionerà – Shamoon

+0

In tal caso, il modo in cui l'hostalias non è applicabile. Ma dovresti provare a impostare l'ambiente appropriato per quel processo. – smitrp

Problemi correlati