我在NSTask中找到了一些东西来执行一个命令,但是我不能让它工作。
这是我的命令:
ioreg -c BNBMouseDevice | grep BatteryPercent我如何在我的可可应用程序中运行它?(当然是以编程的方式)
非常感谢你的帮助。
我已经尝试过了:
NSTask *server = [NSTask new];
[server setLaunchPath:@"/bin/sh"];
[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];
NSPipe *outputPipe = [NSPipe pipe];
[server setStandardInput:[NSPipe pipe]];
[server setStandardOutput:outputPipe];
[server launch];
[server waitUntilExit];
[server release];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *outputString = [[[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; 但它显示没有这样的文件或目录,但如果我在终端中执行此操作:
ioreg -c BNBMouseDevice | grep BatteryPercent它起作用了!
怎么了?
发布于 2011-01-08 02:12:26
在调用/bin/sh时,如果希望外壳程序运行命令,则需要传递-c。它应该等价于:
/bin/sh -c "/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent"您可以通过替换
[server setArguments:[NSArray arrayWithObject:@"ioreg -c BNBMouseDevice | grep BatteryPercent"]];使用
[server setArguments:[NSArray arrayWithObjects:@"-c", @"/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent", nil]];注意,我做了两处更改:参数是一个包含两个元素的数组,即" -c“和"/usr/sbin/ioreg -c BNBMouseDevice | /usr/bin/grep BatteryPercent",我还将ioreg替换为/usr/sbin/ioreg (将grep替换为/usr/bin/grep),以明确表示您对这些特定程序感兴趣。
发布于 2011-01-08 01:56:03
NSTask启动一个命令,该命令将一组参数作为字符串数组。NSTask不做任何外壳解析的魔术,您也不能将字符串作为参数传递给sh并让它以这种方式解析它。可能有一种方法可以做到这一点,但也有更好的解决方案。
只需通过NSTask运行ioreg命令,通过标准方法获取输出,然后对返回的字符串执行简单的枚举以查找所需的行。虽然多了几行代码,但与尝试通过shell注入相比,它的脆弱性要小得多(如果您曾经提供过某种类型的参数,安全漏洞也会少得多)。这很容易做到。
有关详细信息,请参阅this document。
https://stackoverflow.com/questions/4628047
复制相似问题