【问题标题】:Run a terminal command in a Mac app with Swift Xcode使用 Swift Xcode 在 Mac 应用程序中运行终端命令
【发布时间】:2015-07-02 19:09:24
【问题描述】:

我正在尝试在我正在开发的 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 调用,因为它会执行非常特殊的操作来授权用户(包括可能的弹出对话框)。比较stackoverflow.com/questions/4050687/how-to-use-nstask-as-root
  • 感谢您的回复。我还将我当前的代码添加到问题中。
  • 正如我所说,您的方法很可能存在一般问题。查看链接到的线程。

标签: xcode macos swift terminal nstask


【解决方案1】:

试试这个,让我知道它是否有效。您应该使用 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: 3 sysctl: net.inet.tcp.delayed_ack=0: Operation not allowed
  • 您确定您的应用没有沙盒化吗?您是按原样尝试我的代码还是尝试使用 bin/sh 运行路径和额外的参数?另外,如果您使用 sudo 执行此操作,您确定您将管道正确设置为标准输入并提供了 root 访问密码吗?
  • @ManavGabhawala 链接不再有效。你的网站搬家了吗?
猜你喜欢
  • 2018-06-24
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多