我做了一个cocoa swift应用,里面有一个NSTextField。文本字段返回一个密码,然后将其加载到 Process() 中,将其带入 bash 命令脚本。 命令是:Echo ${1} | sudo -S echo 有效 我向进程传递了密码参数,所以它代替了 ${1}。当我运行命令时,控制台显示 usr/bin/sudo: Operation not permitted。 有没有办法在我的 bash 脚本中使用 sudo? 真的很感激帮助。谢谢。
最佳答案
这不是在 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()
运行脚本,它输出“This is a parameter”,一切正常。但是,当脚本运行时,在一个单独的终端窗口中,我运行这个命令:
$ 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了解如何执行此操作。
关于Swift Cocoa - Process() 不允许 sudo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46124643/