向用户请求 `root` 权限以更新 `/etc/paths.d`。

6

我的应用程序安装器使用标准的 open DMG 文件,将其拖到“应用程序”以进行安装,但我想要更新 $PATH,以便从命令行中可以使用我的应用程序。

我认为正确的方法是在第一次运行我的应用程序时调用一个脚本,该脚本会创建一个名为myapp的文件放置于/etc/paths.d目录,并且文件内容应包含以下文本:/Applications/myapp/bin,以及一个新行(ascii 13):

rm /etc/paths.d/myapp
echo "/Applications/myapp/bin" > /etc/paths.d/myapp

目前我遇到了错误;

rm: /etc/paths.d/myapp: No such file or directory
./myapp.sh: line 2: /etc/paths.d/myapp: Permission denied

我需要触发要求用户输入管理员密码的请求,但不确定如何以清晰明确的方式通知用户我对他们的系统做了哪些更改以及为什么要这样做。(我可以将其添加到手册中,但是谁会去读呢?)
有什么建议吗?
PS:我需要在Linux(希望类似)和Windows上执行相同的操作,但如果我能解决MacOS问题,就希望我知道从哪里开始。

请在评论中告诉我是否可以改进这个问题。 - Stephen
我在考虑需要执行类似于 sudo rm /etc/paths.d/myapp echo "/Applications/myapp/bin" > /etc/paths.d/myapp 这样的操作。 - Stephen
你目前的问题似乎是获取root权限。在阅读标题时并不清楚。也许您可以改进它。 - Itchy
谢谢@Itchy,我已经更改了标题。 - Stephen
1个回答

4

AuthorizationExecuteWithPrivileges 长期以来一直已经被弃用,但其仍然存在并在 macOS 11(Big Sur / 10.16)中正常工作。 STPrivilegedTask演示了如何以“安全”的方式调用函数 - 即正确处理函数在将来的 OS 版本中可能会被删除的情况。

使用方法类似于以下内容(出于简洁起见,省略了错误检查等)。这将在 /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);

如何使用这个工具由您决定 - 您可以像cmake一样将其放置在菜单项“安装命令行工具”之后。如果您想要在启动时安装此工具,我建议首先提示用户(并允许他们选择“不再询问”选项)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接