请求用户访问 `root` 以更新 `/etc/paths.d`

Ste*_*hen 6 macos installation config macos-catalina

我的应用程序安装程序使用标准的开放式 DMG,拖动到“应用程序”进行安装,但我想更新$PATH以便我的应用程序可以从命令行使用。

我认为这样做的正确方法是调用第一次我的应用程序运行时创建一个文件,一个脚本myapp/etc/paths.d与文本/Applications/myapp/bin跟着一个换行符(ASCII 13):

rm /etc/paths.d/myapp
echo "/Applications/myapp/bin" > /etc/paths.d/myapp
Run Code Online (Sandbox Code Playgroud)

目前我收到错误;

rm: /etc/paths.d/myapp: No such file or directory
./myapp.sh: line 2: /etc/paths.d/myapp: Permission denied
Run Code Online (Sandbox Code Playgroud)

我需要触发用户输入管理员密码的请求,但我不确定如何以这种方式清楚地告知用户我对他们的系统进行了哪些更改以及原因。(我可以将它添加到手册中,但谁会阅读)

有什么建议?

PS 我需要在 linux(希望类似)和 Windows 上做同样的事情,但是如果我可以对 MacOS 进行排序,希望我知道从哪里开始。

The*_*man 4

AuthorizationExecuteWithPrivileges已弃用很长一段时间,但在 macOS 11 (Big Sur / 10.16) 中仍然存在并工作。STPrivilegedTask演示了如何以“安全”方式调用该函数,即正确处理该函数可能在操作系统的未来版本中被删除的情况。

用法是这样的(为简洁起见,省略了错误检查等)。这将在 /usr/local/bin 中创建一个名为“my-app”的可执行文件的符号链接:

    AuthorizationRef authorizationRef;
    OSStatus err;

    const char* tool = "/bin/ln";
    char *args[] = {
        "-sf", 
        [[[NSBundle mainBundle] executablePath] UTF8String],
        "/usr/local/bin/my-app", 
        nil
    };

    AuthorizationCreate(nil, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &authorizationRef);

    err = AuthorizationExecuteWithPrivileges(authorizationRef, tool, kAuthorizationFlagDefaults, args, nil);

    switch (err)
    {
        case errAuthorizationCanceled:
            // user cancelled prompt
            break;
        case errAuthorizationSuccess:
            // success
            break;
        default:
            // an error occurred
            break;
    }

    AuthorizationFree(authorizationRef, kAuthorizationFlagDefaults);
Run Code Online (Sandbox Code Playgroud)

如何使用它取决于你 - 你可以将它放在菜单项(“安装命令行工具”)后面,就像 cmake 那样。如果您想在启动时安装它,我建议首先提示用户(并允许他们选择“不要再问我”)。