2011-07-22 14 views
9

का उपयोग कर मैं इस कॉमम्ड ps -ef | grep test को एनएसटीस्क का उपयोग करके निष्पादित करने की कोशिश कर रहा हूं लेकिन मुझे नहीं मिल रहा है। ग्रेप परीक्षण NSTask में शामिल किया जाना:के साथ खोल कमांड निष्पादित | (पाइप) एनएसटीस्क

यह मैं वर्तमान में एक स्ट्रिंग में ps -ef के उत्पादन प्राप्त करने के लिए क्या उपयोग कर रहा हूँ तो मैं किसी भी तरह की प्रक्रिया परीक्षण के पीआईडी ​​प्राप्त करने की आवश्यकता है

NSTask *task; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: @"/bin/ps"]; 

NSArray *arguments; 
arguments = [NSArray arrayWithObjects: @"-ef", nil]; 
[task setArguments: arguments];  
NSPipe *pipe; 
pipe = [NSPipe pipe]; 
[task setStandardOutput: pipe]; 

NSFileHandle *file; 
file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *data; 
data = [file readDataToEndOfFile]; 

NSString *string; 
string = [[NSString alloc] initWithData: data 
           encoding: NSUTF8StringEncoding]; 
NSLog (@"got\n%@", string); 
+0

आप अपने प्रोग्राम में फ़िल्टरिंग क्यों नहीं करते हैं? Grep को पिपिंग धीमा हो जाएगा। –

उत्तर

0

कार्य शुरू करने से पहले आपको [task waitUntilExit] को कॉल करने की आवश्यकता हो सकती है, ताकि आउटपुट पढ़ने से पहले प्रक्रिया चलाना समाप्त हो सके।

+0

प्रक्रिया समाप्त हो गई है और मुझे स्ट्रिंग में ps -ef का आउटपुट मिलता है। लेकिन मुझे उस आउटपुट पर grep परीक्षण करने की भी आवश्यकता है। – ed1t

15

पाइपिंग गोले द्वारा प्रदान की जाने वाली एक विशेषता है, जैसे /bin/sh। आप इस तरह के एक खोल के माध्यम से अपने आदेश लांच करने का प्रयास हो सकता है: यदि आप उपयोगकर्ता एक मूल्य की आपूर्ति करते हैं

/* ... */ 
[task setLaunchPath: @"/bin/sh"]; 
/* ... */ 
arguments = [NSArray arrayWithObjects: @"-c", @"ps -ef | grep test", nil]; 

बहरहाल, (के बजाय हार्ड-कोड जैसे test), तो आपको प्रोग्राम इंजेक्शन हमले से शैल के लिए अतिसंवेदनशील, बना रहे हैं जो एसक्यूएल इंजेक्शन की तरह हैं।

NSTask *psTask = [[NSTask alloc] init]; 
NSTask *grepTask = [[NSTask alloc] init]; 

[psTask setLaunchPath: @"/bin/ps"]; 
[grepTask setLaunchPath: @"/bin/grep"]; 

[psTask setArguments: [NSArray arrayWithObjects: @"-ef", nil]]; 
[grepTask setArguments: [NSArray arrayWithObjects: @"test", nil]]; 

/* ps ==> grep */ 
NSPipe *pipeBetween = [NSPipe pipe]; 
[psTask setStandardOutput: pipeBetween]; 
[grepTask setStandardInput: pipeBetween]; 

/* grep ==> me */ 
NSPipe *pipeToMe = [NSPipe pipe]; 
[grepTask setStandardOutput: pipeToMe]; 

NSFileHandle *grepOutput = [pipeToMe fileHandleForReading]; 

[psTask launch]; 
[grepTask launch]; 

NSData *data = [grepOutput readDataToEndOfFile]; 

/* etc. */ 

यह निर्मित फाउंडेशन कार्यक्षमता एक ही प्रदर्शन करने के लिए उपयोग करता है: एक वैकल्पिक है, जो इस समस्या से ग्रस्त नहीं है, एक पाइप वस्तु का उपयोग करने के grep के मानक इनपुट के साथ ps के मानक उत्पादन कनेक्ट करने के लिए है शेल के रूप में कदम होता है जब यह | चरित्र से मुकाबला करता है।

अंत में जैसे अन्य ने इंगित किया है, grep का उपयोग अधिक है। बस इसे अपने कोड में जोड़ें:

NSArray *lines = [string componentsSeparatedByString:@"\n"]; 
NSArray *filteredLines = [lines filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"SELF contains[c] 'test'"]]; 
+1

+1 यह उल्लेख करने के लिए कि "पाइपिंग गोले द्वारा प्रदान की गई एक विशेषता है ..."। मैं वर्षों के कारण की तलाश में था! – Eonil

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