2

Objective 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見えます。

さらに重要なことに、sudoNSTask からの実行は機能しません。特権コマンドを起動するには、 Authorization Servicesを使用する必要があります。

于 2013-01-29T22:28:49.663 に答える
1

完全な実行可能パスを指定する必要があり、引数は起動パスではなく、引数として指定する必要があります。NSTaskシェルではありません。内部的に syscalls ( 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 に答える