我编写了一个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;
}
}); }