使用NSTask更改osx网络配置

时间:2014-09-06 12:22:16

标签: objective-c macos cocoa nstask

我试图禁用Wifi,设置socks proxy:ip,port,login:pass然后重新启用wifi。 我试图用

执行此操作
NSTask *task = [NSTask new];

[task setLaunchPath:@"/bin/sh"];

[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi off"]];

[task launch];

但我不确切知道如何传递多个参数 - 设置socks代理 我不知道如何禁用和启用wifi,代码高于剂量工作,最后一个问题是我如何设置系统密码,不要被问及管理员权限来改变这一点。

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/networksetup.8.html

1 个答案:

答案 0 :(得分:0)

在向上扩展时,将多个参数传递给NSTask是一件麻烦事,例如,将下面的内容传递给带有引号和反斜杠的NSTask以逃避特殊字符,将会失败。

networksetup -getsecurewebproxy Wi-Fi | awk -F ': ' '{ print $2 }' && networksetup -getwebproxy Wi-Fi | awk -F ': ' '{ print $2 }

但是,如果将代码添加到shell脚本中,并使用NSTask运行shell脚本,则不会有问题。

.h file

@property (nonatomic, strong) __block NSTask *buildTask;
@property (nonatomic, strong) NSPipe *outputPipe;


.m file

NSMutableArray *arguments = [[NSMutableArray alloc] init];
[arguments addObject:@"Wi-FI"];
[arguments addObject:@"off"];


//location of script to run
NSString * locationOfScript = [[NSBundle mainBundle] pathForResource:@"wifi" ofType:@"sh"];

    self.buildTask            = [[NSTask alloc] init];
    self.buildTask.launchPath = locationOfScript;       //location of wifi script to run
    self.buildTask.arguments  = arguments;

    // Output Handling
    self.outputPipe               = [[NSPipe alloc] init];
    self.buildTask.standardOutput = self.outputPipe;


    [[self.outputPipe fileHandleForReading] waitForDataInBackgroundAndNotify];
    [self.buildTask launch];
    [self.buildTask waitUntilExit];

  if ([self ->_buildTask terminationStatus] == 0) {
  //Confirms NSTask completes correctly.
  }

在xcode项目中创建一个新文件,使用以下内容将其添加到您的项目中。

#!/bin/sh
networksetup -setwebproxystate Wi-Fi off

您将需要使用终端chmod + x wifi.sh,否则您将收到错误(找不到文件)

NSMutableArray的参数将按顺序传递给shell脚本,并且可以通过上面示例中的“$ {1}”作为@“Wi-Fi”进行访问。

关于您的其他问题,您无法绕过管理员密码的要求。 您可以将命令添加到sudoers文件中,并且不会询问密码,但是此方法对于生产应用程序不实用。

对于你的Socks问题,最简单的方法是在项目名称socks.sh中创建一个新文件,你可以使用;     [-setsocksfirewallproxy networkservice domain portnumber authenticated username password]     [-setsocksfirewallproxystate networkservice on |断]

有关networksetup和可用选项的更多信息,请参阅networksetup手册页(链接如下) [链接] https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/networksetup.8.html