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

10

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

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

我已经尝试使用NSTask,但似乎每次都做错了什么。

我只想运行这个命令并打印输出。 感谢您的关注。

顺便说一句,这是我当前代码的样子(感谢您的回复):

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: 操作不允许


你还没有展示你尝试过什么,但我假设你不能简单地将sudo作为NSTask调用,因为它会执行授权用户的特殊操作(包括可能会弹出对话框)。可以参考https://dev59.com/zW855IYBdhLWcg3w-JbS。 - Martin R
谢谢您的回复。我也在问题中添加了我的当前代码。 - MRF
就像我说的那样,你的方法很可能存在一般性问题。请查看链接的线程。 - Martin R
1个回答

8

尝试这个并让我知道是否有效。你应该在后台线程上使用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访问权限的用户的密码输入。所有密码输入错误都将在标准错误管道中显示。如果这行得通,请告诉我。


感谢Manav提供详细的答案。我使用了你的解决方案,它大大改善了我的代码,但是我收到了以下输出信息: net.inet.tcp.delayed_ack: 3sysctl: net.inet.tcp.delayed_ack=0: 操作不允许 - MRF
你确定你的应用程序没有被沙盒化吗?另外,你是按原样尝试了我的代码,还是使用了bin/sh运行路径和额外参数?如果你使用sudo尝试过,你确定正确设置了管道到标准输入,并提供了root访问密码吗? - Manav Gabhawala
@ManavGabhawala 这个链接已经失效了。你的网站搬家了吗? - Pro Q

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接