Swift Cocoa - Process()不允许sudo

时间:2017-09-08 21:15:22

标签: swift bash macos cocoa

我做了一个cocoa swift应用程序,其中有一个NSTextField。 textfield返回一个密码,然后将其加载到Process()中,将其带入bash命令脚本。 命令是:Echo $ {1} | sudo -S echo工作 在这个过程中,我传递了密码的参数,因此它代替$ {1}。当我运行命令时,控制台说usr / bin / sudo:操作不被允许。 有没有办法在我的bash脚本中使用sudo? 真的很感激帮助。感谢。

1 个答案:

答案 0 :(得分:3)

这不是升级OS X权限的正确方法,特别是因为它的安全性很差;你以明文形式传递密码是一种普遍不好的做法。

让我说明为什么这是一个问题。假设我有这个bash脚本:

#!/bin/bash

sleep 10

echo ${1}

然后,我使用Process执行我的脚本:

import Foundation

let process = Process()

process.launchPath = "/bin/bash"
process.arguments = ["/path/to/foo.sh", "This is a parameter"]

process.launch()
process.waitUntilExit()

运行脚本,输出"这是一个参数",一切似乎都很好。但是,当脚本运行时,在单独的终端窗口中,我运行此命令:

$ ps -ajxww | grep foo.sh

获得输出:

username          85281 85276 85281      0    1 S    s006    0:00.00 /bin/bash /path/to/foo.sh This is a parameter

如您所见,该参数在进程列表中清晰可见。如果该脚本的参数是我的管理员密码,我只需将该密码广播给系统上每个感兴趣的进程。

无论如何,您应该创建一个特权launchd帮助工具,而不是做这样的事情,您可以使用SMJobBless()来祝福它。操作系统将以安全的方式提示输入密码,并将您的帮助工具安装在安全的位置。然后,您可以通过XPC与您的工具进行通信,让它以root身份执行操作。请参阅Apple的EvenBetterAuthorizationSample了解如何执行此操作。