2

我想从目标 C(Cocoa 框架)执行命令。我正在尝试的命令如下。我尝试使用 NSTask,但是当我执行它时它说“启动路径不可访问”。

sudo ifconfig en0 down 

我的代码是:

- (void)testme {
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"sudo ifconfig en0 down"];

NSArray *arguments;
arguments = [NSArray arrayWithObjects: @"foo", @"bar.txt", 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 (@"command returned:\n%@", string);

[string release];
[task release];

}

4

2 回答 2

5

sudo ifconfig en0 down不是一个明智的发射路径。此命令的正确启动路径是/usr/sbin/sudo.

完成后,您仍然需要将正确的参数传递给setArguments:. foo并且bar.txt看起来像您在没有阅读的情况下复制的示例代码。

更重要的是,虽然,sudo从 NSTask 运行将不起作用。您将需要使用授权服务来启动特权命令。

于 2013-01-29T22:28:49.663 回答
1

您需要指定完整的可执行路径,并且应该将参数指定为参数,而不是与启动路径一起指定。NSTask不是外壳,它在内部使用系统调用(execv()我猜)来调用命令。

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

NSArray *arguments = @[@"ifconfig", @"en0", @"down"];
[task setArguments:arguments];
于 2013-01-29T22:29:23.137 回答