2011-06-03 14 views
8

मेरे कोको एप्लिकेशन में मैं कुछ बुनियादी गिट कमांड चलाने के लिए NSTask का उपयोग करने का प्रयास कर रहा हूं। जब भी मैं एक दूरस्थ का उपयोग करने की (git push जैसे, git pull) एक आदेश है कि अनुमतियों (SSH कुंजियां) की आवश्यकता है चलाने के लिए, यह निम्नलिखित त्रुटि के साथ विफल:एनएसटीस्क और गिट - अनुमतियां

Permission denied (publickey). The remote end hung up unexpectedly

एक ही आदेशों चल टर्मिनल से बस ठीक काम करता है, तो मैं ' मैं सोच रहा हूं कि यह NSTask के साथ एक समस्या हो सकती है जो एक पर्यावरण चर सेट नहीं कर रहा है जिसे एसएसएच कुंजी तक पहुंचने की प्रक्रिया में कहीं भी इस्तेमाल किया जाएगा। मैं मैन्युअल रूप से इस तरह HOME और USER वातावरण चर की स्थापना की कोशिश की:

[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:NSHomeDirectory(), @"HOME", NSUserName(), @"USER", nil]]; 

लेकिन यह कोई प्रभाव नहीं है। क्या यह कोई विशेष पर्यावरण चर है जिसे मुझे NSTask में ठीक से काम करने के लिए सेट करना है?

संपादित करें: डस्टिन की नोक के लिए धन्यवाद, मुझे यह पता लगाने में थोड़ा और आगे मिला। मैं अपने वर्तमान सत्र के लिए वातावरण चर सूची env आदेश का इस्तेमाल किया और मैं इस पाया:

SSH_AUTH_SOCK=/tmp/launch-DMQopt/Listeners 

परीक्षण करने के लिए, मुझे लगता है कि मार्ग की नकल की और NSTask का एक वातावरण चर के रूप में सेट और कोड फिर से भाग गया, और यह समय यह काम किया! उस ने कहा, मुझे यकीन है कि प्रत्येक सत्र के लिए SSH_AUTH_SOCK परिवर्तन इसलिए मैं इसे केवल हार्डकोड नहीं कर सकता। मैं इस चर को गतिशील रूप से कैसे उत्पन्न/पुनर्प्राप्त करूं?

+1

इसे दूसरी तरफ आज़माएं, कमांडलाइन पर 'env -i' का उपयोग करें और देखें कि इसे काम करने से पहले आपको कितना जोड़ना होगा। – Dustin

+0

आपकी टिप के लिए थोड़ा और धन्यवाद मिला, मेरी संपादित पोस्ट पढ़ें :) – indragie

उत्तर

4

आप (Ira से) कोशिश करते हैं और ट्यूटोरियल "Wrapping rsync or SSH in an NSTask 'का अनुसरण कर सकता है, जो SSH_AUTH_SOCK चर का उल्लेख करता है:

Since writing this post I've realised that I omitted an important additional step in setting up the environment variables for the NSTask.
In order to make passwordless key-based authentication work it's necessary to grab the SSH_AUTH_SOCK variable from the user's environment and include this in the NSTask's environment.
So, when setting environment variables for example;

NSTask *task; 
NSDictionary *environmentDict = [[NSProcessInfo processInfo] environment]; 
// Environment variables needed for password based authentication 
NSMutableDictionary *env = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
         @"NONE", @"DISPLAY",       askPassPath, @"SSH_ASKPASS", 
         userName,@"AUTH_USERNAME", 
         hostName,@"AUTH_HOSTNAME", 
         nil]; 

// Environment variable needed for key based authentication 
[env setObject:[environmentDict objectForKey:@"SSH_AUTH_SOCK"] forKey:@"SSH_AUTH_SOCK"]; 

// Setting the task's environment 
[task setEnvironment:env]; 

हालांकि, ओपी indragie टिप्पणियां:

I had tried this earlier but since it was being invoked with XCode, the SSH_AUTH_SOCK env var. wasn't being passed to it.
Opening the app from Finder corrects this issue.



With askPassPath being the path for the Askpass executable, which is included as part of the application’s main bundle. (In order to do this, find the executable under “Products” in xcode, and then drag it into “Copy Bundle Resources” on the main application’s target.)

// Get the path of the Askpass program, which is 
// setup to be included as part of the main application bundle 
NSString *askPassPath = [NSBundle pathForResource:@"Askpass" 
       ofType:@"" 
       inDirectory:[[NSBundle mainBundle] bundlePath]]; 
+1

मैंने पहले यह कोशिश की थी, लेकिन चूंकि इसे एक्सकोड, एसएसएच_एयूथ_SOCK env var के साथ बुलाया जा रहा था। इसे पारित नहीं किया जा रहा था। फाइंडर से ऐप खोलना इस मुद्दे को ठीक करता है। धन्यवाद! – indragie

+0

@indragie: बढ़िया। मैंने अधिक दृश्यता के उत्तर में आपकी टिप्पणी शामिल की है। – VonC

+0

@ वॉनसी क्या आप मुझे बता सकते हैं कि पूछताछ क्या है? –

संबंधित मुद्दे