Swift Cocoa - Process() 不允许 sudo

标签 swift bash macos cocoa

我做了一个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/

相关文章:

ios - 实例化存储在元类型字典中的类

ios - 为什么在 swift 中一切都是元组?

linux - Bash 子进程正在重复

java - 需要使用brew : Java 1. 7在Mac上安装Zeppelin

objective-c - 添加和删​​除 View 时跳转到字段时出现问题

ios - 如何使用自动布局调整 ScrollView 内容大小

ios - AVCaptureVideoPreviewLayer 视频帧大小

arrays - 如何使用 BASH 将 tar 命令中的文件读取到数组中?

bash - 我的美元?命令成功代码失败,为什么?

swift - Finder 同步扩展无法从桌面读取/写入文件