2015-07-02 16 views
5

के साथ मैक ऐप में एक टर्मिनल कमांड चलाएं मैं एक मैक ऐप में टर्मिनल कमांड चलाने की कोशिश कर रहा हूं जिसे मैं विकसित कर रहा हूं। टर्मिनल कमांड है:स्विफ्ट एक्सकोड

sudo sysctl -w net.inet.tcp.delayed_ack=0 

मैंने एनएसटीस्क का उपयोग करने का प्रयास किया है लेकिन ऐसा लगता है कि मैं हर बार कुछ गलत कर रहा हूं।

मैं सिर्फ यह आदेश चलाने और आउटपुट मुद्रित करना चाहता हूं। आपके ध्यान के लिए धन्यवाद।

पीएस। यहाँ मेरे वर्तमान कोड (अपने उत्तर के लिए धन्यवाद) ऐसा दिखाई देता है:

let task = NSTask() 
task.launchPath = "/usr/sbin/sysctl" 
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"] 
let pipe = NSPipe() 
task.standardOutput = pipe 
task.standardError = pipe 
task.launch() 
task.waitUntilExit() 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

मैं उत्पादन में निम्नलिखित संदेश प्राप्त होता है:
net.inet.tcp.delayed_ack: 3
sysctl: net.inet। tcp.delayed_ack = 0: ऑपरेशन की अनुमति नहीं है

+0

आपने जो कुछ भी नहीं किया है, उसे आपने नहीं दिखाया है, लेकिन मुझे लगता है कि आप बस सूडो को एनएसटीस्क के रूप में नहीं बुला सकते हैं, क्योंकि यह उपयोगकर्ता को अधिकृत करने के लिए बहुत ही खास चीजें करता है (संभावित पॉप-अप संवाद सहित)। Http://stackoverflow.com/questions/4050687/how-to-use-nstask-as-root की तुलना करें। –

+0

आपके उत्तर के लिए धन्यवाद। मैंने प्रश्न में अपना वर्तमान कोड भी जोड़ा। – MRF

+0

जैसा कि मैंने कहा, आपके दृष्टिकोण के साथ सबसे अधिक सामान्य समस्याएं हैं। जुड़े हुए धागे पर एक नज़र डालें। आपके विस्तृत उत्तर के लिए –

उत्तर

5

इसे आज़माएं और यह काम करने पर मुझे बताएं। आपको dispatch_async या NSOperationQueue का उपयोग करके पृष्ठभूमि थ्रेड पर ऐसा करना चाहिए। http://manavgabhawala.me/#/blog/grand-central-dispatch

let task = NSTask() 
task.launchPath = "/usr/sbin/sysctl" 
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"] 
let pipe = NSPipe() 
task.standardOutput = pipe 
task.standardError = pipe 
task.launch() 
task.waitUntilExit() 
let data = pipe.fileHandleForReading.readDataToEndOfFile() 
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String 

इसके अलावा, आप प्रश्न अपडेट सटीक त्रुटि और कोड आप NSTask साथ प्रयोग कर रहे हैं यह काम नहीं करता शामिल करने के लिए कर सकते हैं तो कृपया: कैसे का उपयोग कर काम करना अधिक जानकारी के लिए ग्रांड सेंट्रल डिस्पैच मेरी पोस्ट पढ़ । अब इसमें सूडो प्रभाव नहीं होगा जो आप चाहते थे यदि आप इसे देखना चाहते हैं: https://developer.apple.com/library/mac/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html जो आपको सूडो का उपयोग करने के तरीके के बारे में बताता है। एक unsandboxed ऐप के लिए आप उपर्युक्त जैसा ही कर सकते हैं लेकिन launchPath से /bin/sh को बदलें और फिर "-S" पर एक तर्क जोड़ें और "/usr/sbin/sysctl" पर तर्क भी जोड़ें। फिर आप उपयोगकर्ता के पासवर्ड में पाइप तक standardInput का उपयोग कर सकते हैं जिनके पास रूट पहुंच है। सभी पासवर्ड एंट्री त्रुटियां मानक त्रुटि पाइप में आ जाएंगी। अगर यह कार्यशील है, तो मुझे बताएं।

+0

धन्यवाद मानव। मैंने आपके समाधान का उपयोग किया और यह मेरे कोड को बहुत सुधार हुआ, हालांकि मुझे निम्न आउटपुट संदेश प्राप्त हुआ: net.inet.tcp.delayed_ack: 3 sysctl: net.inet.tcp.delayed_ack = 0: ऑपरेशन की अनुमति नहीं है – MRF

+0

क्या आप निश्चित हैं आपका ऐप सैंडबॉक्स नहीं है? क्या आपने मेरे कोड को भी कोशिश की है या आपने बिन/श रन रन पथ और अतिरिक्त तर्कों के साथ प्रयास किया है? इसके अलावा यदि आपने सुडो के साथ ऐसा किया है तो क्या आप सुनिश्चित हैं कि आपने पाइप को मानक इनपुट पर सही तरीके से सेटअप किया है और रूट एक्सेस पासवर्ड प्रदान किया है? –

+0

@ मणवगभावाला लिंक अब सक्रिय नहीं है। क्या आपकी वेबसाइट चली गई है? –

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