使用Swift Xcode在Mac应用程序中运行终端命令

时间:2015-07-02 19:09:25

标签: xcode macos swift terminal nstask

我正在尝试在我正在开发的Mac应用程序中运行终端命令。终端命令是:

sudo sysctl -w net.inet.tcp.delayed_ack=0

我尝试过使用NSTask,但似乎我每次都做错了。

我只想运行此命令并打印输出。 谢谢你的关注。

PS。这是我当前代码的样子(感谢您的回复):

let task = NSTask()
task.launchPath = "/usr/sbin/sysctl"
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"]
let pipe = NSPipe()
task.standardOutput = pipe
task.standardError = pipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String

我在输出中收到以下消息:
net.inet.tcp.delayed_ack:3
sysctl:net.inet.tcp.delayed_ack = 0:不允许操作

1 个答案:

答案 0 :(得分:5)

试试这个,让我知道它是否有效。您应该使用dispatch_async或NSOperationQueue在后台线程上执行此操作。有关如何使用Grand Central Dispatch执行操作的更多信息,请阅读我的帖子:http://manavgabhawala.me/#/blog/grand-central-dispatch

let task = NSTask()
task.launchPath = "/usr/sbin/sysctl"
task.arguments = ["-w", "net.inet.tcp.delayed_ack=0"]
let pipe = NSPipe()
task.standardOutput = pipe
task.standardError = pipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String

另外,如果这不起作用,请您更新问题以包含确切的错误以及您使用NSTask的代码。现在,如果你想看看它,你就不会有你想要的sudo效果:https://developer.apple.com/library/mac/documentation/Security/Conceptual/authorization_concepts/01introduction/introduction.html它告诉你如何使用sudo。对于未经过沙盒消毒的应用,您也可以执行与上述相同的操作,但将launchPath更改为/bin/sh,然后添加参数"-S"并添加参数"/usr/sbin/sysctl"。然后,您可以使用standardInput来输入具有root访问权限的用户的密码。所有密码输入错误都将出现在标准错误管道中。如果有效,请告诉我。