在Mac OS中使用NSTask运行shell脚本

时间:2014-06-20 09:42:08

标签: objective-c xcode shell networking nstask

我编写了一个shell脚本,该脚本的目的是使用TCPDUMP捕获数据包并将该捕获数据包写入.pcap文件

脚本是:TCPDumpScript.sh

回声"彼得" | sudo -S tcpdump -i rv0 -n -s 0 -w dumpfile.pcap tcp

我正在使用NSTask启动(TCPDumpScript.sh)。获得以下输出

tcpdump:警告:rv0:该设备不支持混杂模式 (BIOCPROMISC:套接字不支持操作) tcpdump:警告:rv0:未分配IPv4地址 tcpdump:详细输出被抑制,使用-v或-vv进行完整协议解码 监听rv0,链路类型PKTAP(Packet Tap),捕获大小65535字节

问题1: 使用NSTask。 " dumpfile.pcap"正在创建。 但是当我使用终端运行相同的脚本时,它会被创建所需的捕获数据包。

问题2: 每当在 TCPDumpScript.sh 中进行更改,然后使用NSTask启动脚本时。我收到了以下错误 "启动路径无法访问"

但是我通过终端来做 chmod + x TCPDumpScript.sh

然后我可以使用NSTask启动此脚本而不会出现任何错误。

所以,我的问题是我不能创建文件(问题1)" dumpfile.pcap"使用NSTask? 我是否总是要求在脚本文件上运行权限更改命令(问题2)?

请指导我。

  • (void)runScript:(NSArray *)arguments {

    dispatch_queue_t taskQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0); dispatch_async(taskQueue,^ {

    self.isRunning = YES;
    
    @try {
    
        NSString *path  = [NSString stringWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:@"TcpDumpScript" ofType:@"sh"]];         
        self.buildTask            = [[NSTask alloc] init];
        self.buildTask.launchPath = path;
        self.buildTask.arguments  = arguments;
    
        // Output Handling
        self.outputPipe               = [[NSPipe alloc] init];
        self.buildTask.standardOutput = self.outputPipe;
    
        [[self.outputPipe fileHandleForReading] waitForDataInBackgroundAndNotify];
    
        [[NSNotificationCenter defaultCenter] addObserverForName:NSFileHandleDataAvailableNotification object:[self.outputPipe fileHandleForReading] queue:nil usingBlock:^(NSNotification *notification){
    
            NSData *output = [[self.outputPipe fileHandleForReading] availableData];
            NSString *outStr = [[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding];
    
            dispatch_sync(dispatch_get_main_queue(), ^{
                self.outPutTxt.string = [self.outPutTxt.string stringByAppendingString:[NSString stringWithFormat:@"\n%@", outStr]];
                // Scroll to end of outputText field
                NSRange range;
                range = NSMakeRange([self.outPutTxt.string length], 0);
                [self.outPutTxt scrollRangeToVisible:range];
            });
    
            [[self.outputPipe fileHandleForReading] waitForDataInBackgroundAndNotify];
        }];
    
        [self.buildTask launch];
    
        [self.buildTask waitUntilExit];
    }
    @catch (NSException *exception) {
        NSLog(@"Problem Running Task: %@", [exception description]);
    }
    @finally {
        [self.Start setEnabled:YES];
        [self.spinner stopAnimation:self];
        self.isRunning = NO;
    }
    

    }); }

0 个答案:

没有答案