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

में ssh-कुंजी जोड़कर क्लोन git नहीं कर सकते मैं (उन है कि कमाल के हैं के लिए coffee का प्रयोग करके) कोशिश कर रहा हूँ कि नोड में। लेकिन किसी कारण से, जब यह चलता है, तो यह मुझे एक त्रुटि देता है: Error: Command failed: conq: repository access denied. deployment key is not associated with the requested repository.Node.js

सुनिश्चित नहीं है कि मैं क्या गलत कर रहा हूं। अगर मैं कमांड लाइन से उन आदेशों को सीधे चलाता हूं, तो सबकुछ ठीक काम करता प्रतीत होता है। कोई विचार?

+0

आप 'ssh' के साथ सीधे इस प्रजनन, समीकरण से Git लेने की कोशिश की है? यद्यपि आप बिटबकेट के सर्वर से कुछ भी उपयोगी नहीं होने की संभावना नहीं है (त्रुटि संदेश से मुझे लगता है कि आप इसका उपयोग कर रहे हैं) आपको देखना चाहिए "आप बिटबकेट से कनेक्ट करने के लिए गिट या एचजी का उपयोग कर सकते हैं। शैल एक्सेस अक्षम है।" अगर यह काम करता है; यदि आप काम नहीं करते हैं तो आप डीबग करने के लिए 'ssh -v' आज़मा सकते हैं। –

+0

एक और चीज जिसे आप कोशिश कर सकते हैं वह एक रैपर शेल स्क्रिप्ट बनाना है जो 'exec ssh -v" $ @ "चलाता है और 'GIT_SSH' पर्यावरण चर सेट करता है ताकि गिट वर्बोज मोड में एसएसएच चलाए। फिर आप देख सकते हैं कि 'git' एसएसएच कैसे चला रहा है और यह आपको कुछ सुराग दे सकता है। –

उत्तर

4

जब आप node.js से git clone प्रक्रिया निष्पादित करने का प्रयास करते हैं, तो यह विभिन्न वातावरण में चलता है।

जब आप git clone सुरक्षित (एसएसएच प्रोटोकॉल पर) भंडार पर उपयोग करते हैं, ssh-agent पहले आपको प्रदान की गई सार्वजनिक कुंजी के साथ प्रमाणित करने का प्रयास करता है। चूंकि exec प्रत्येक कॉल के लिए अलग-अलग रनटाइम वातावरण का उपयोग करें, भले ही आप अपनी निजी कुंजी स्पष्ट रूप से जोड़ रहे हों, यह अलग-अलग रनटाइम वातावरण के कारण काम नहीं करेगा।

एसएसएच में प्रमाणीकरण करते समय, गिट क्लोन SSH_AUTH_SOCK के लिए दिखता है। आम तौर पर इस env चर में आपके पासवर्ड कीरिंग सेवा का पथ होता है जैसे (gnome-keyring या kde-wallet)।

इसे पहले जांचने के लिए प्रयास करें।

env | grep -i ssh 

इसे SSH_AGENT_PID और SSH_AUTH_SOCK सूचीबद्ध करना चाहिए। समस्या तब होती है जब git clone चल रहा है, इन परिवेश चर सेट नहीं हैं। इसलिए आप उन्हें निष्पादित कर सकते हैं (केवल SSH_AUTH_SOCK पर्याप्त है) निष्पादन फ़ंक्शन कॉल में विकल्प के रूप में। एनवी कुंजी-जोड़े को निष्पादित करने के तरीके को पास करने के तरीके पर 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); 

अगर यह काम नहीं करता है, कार्यकारी समारोह में ssh -vvv [email protected] निष्पादित करने के लिए प्रयास करें। इस प्रक्रिया के आउटपुट को देखें, आपको त्रुटि मिल जाएगी।

यदि त्रुटि debug1: No more authentication methods to try. Permission denied (publickey). कहती है, तो इस तरह की होस्ट HOIA/.ssh/config फ़ाइल में होस्ट उपनाम जोड़ें।

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

यह निर्दिष्ट मेजबान के सभी ऑथेंटिकेशन अनुरोधों के लिए प्रदान की गई निजी कुंजी का उपयोग करेगा। इस विकल्प में, आप उपरोक्त फ़ाइल में कॉन्फ़िगर होस्टलीस का उपयोग करने के लिए अपना origin's यूआरएल भी बदल सकते हैं। reporoot/.git/config फ़ाइल इस तरह दिखेगी।

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

मैं संभावित रूप से हजारों रिपो के लिए प्रोग्रामिंग करने की कोशिश कर रहा हूं जिनके पास मेरा स्वामित्व या नियंत्रण नहीं है। मैं 'ssh' कुंजी उत्पन्न करता हूं और हमारे उपयोगकर्ता उन्हें अपनी तैनाती कुंजी में जोड़ देंगे। तो मुझे यकीन नहीं है कि यह – Shamoon

+0

काम करेगा यदि उस मामले में होस्टलीस तरीका लागू नहीं है। लेकिन आपको उस प्रक्रिया के लिए उचित वातावरण स्थापित करने की कोशिश करनी चाहिए। – smitrp