如何在 macOS 应用程序中执行 sudo 命令并保留 root 用户权限?

问题描述 投票:0回答:1

我需要在我的应用程序中实现以下行为:当应用程序首次运行时,提示用户通过输入管理密码进行身份验证。身份验证成功后,使用 macOS 钥匙串访问安全地存储管理密码。对于同一命令的后续执行,从钥匙串中检索存储的密码并使用它来执行特权命令,而不需要用户再次输入管理密码。通过实施这种方法,用户只需要进行一次身份验证,并且特权命令的后续执行将是无缝的,而无需进一步的身份验证提示。 (我需要在我的应用程序中以编程方式执行一组 sudo。)

您能否确认为此目的在 macOS 应用程序开发中是否需要任何特定权利?此外,macOS 中是否有特定的服务可以促进此类实施?谢谢!

macos desktop-application root sudo
1个回答
0
投票

您需要使用

AuthorizationServices
SecurityFoundation
API 请求访问权限。这是使用
SFAuthorization
授权为管理员的简单示例:

import SecurityFoundation

func authorize() -> Bool {
    guard let auth = SFAuthorization.authorization() as? SFAuthorization,
          let admin = NSString(string: kAuthorizationRuleAuthenticateAsAdmin).utf8String
    else {
        // Authorization failed
        return false
    }
    
    do {
        try auth.obtain(withRight: admin, flags: [.interactionAllowed, .extendRights])
        return true
    } catch {
        // Authorization failed
        return false
    }
}

// Usage
let admin = authorize()
print("Authorized:", admin)

请注意,如果您的应用程序是沙盒的,这将不起作用。

Apple 论坛上的这个帖子中有很多有关在 Swift 中使用授权 API 的讨论和示例:
https://forums.developer.apple.com/forums/thread/675712

SFAuthorization
(上面使用的)是一个更高级别的 API,但基于该 trhead,它似乎有其警告。该示例中的关键(
kAuthorizationRuleAuthenticateAsAdmin
)是不是正确的名称,而是规则名称,这意味着它在某些授权方法中会失败。

另一方面,

AuthorizationServices
要求您使用非 ARC 引用,这在 Swift 中有点令人畏惧,并且您需要一些 C 和内存管理知识。上面链接的线程还有 Quinn 的一个示例,用于在 Swift 中包装授权 API。

在 ARC 之前的 Objective C 中使用

SFAuthorization
的示例应用程序:
https://cocoawithlove.com/2009/05/invoking-other-processes-in-cocoa.html

© www.soinside.com 2019 - 2024. All rights reserved.