我想从目标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];
}
答案 0 :(得分:5)
sudo ifconfig en0 down
不是明智的发射路径。此命令的正确启动路径为/usr/sbin/sudo
。
完成后,您仍需要将正确的参数传递给setArguments:
。 foo
和bar.txt
看起来像是您在不阅读时复制的示例代码。
更重要的是,从NSTask运行sudo
将无效。您需要使用Authorization Services启动特权命令。
答案 1 :(得分:1)
您需要指定完整的可执行文件路径,并且应将参数指定为参数,而不是与启动路径一起指定。 NSTask
不是shell,它在内部使用系统调用(execv()
,我猜)来调用命令。
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/sudo"];
NSArray *arguments = @[@"ifconfig", @"en0", @"down"];
[task setArguments:arguments];