LaunchAgent 具有不受欢迎的 root 访问权限

LaunchAgent 具有不受欢迎的 root 访问权限

我在以普通(非 root)用户身份运行 LaunchAgent 时遇到了问题。我读到的所有内容都表明这应该是默认行为。预期是,如果您将 plist 放在 /Library/LaunchAgents 中,那么当它加载时,它会在用户登录时以用户身份为用户加载。

然而我发现,如果你使用 sudo 运行 launchctl ('sudo launchctl load /Library/LaunchAgents/myagent.plist'),那么该过程将在用户会话中启动以 root 身份。这意味着“ps u -ax”显示以“root”身份运行的进程,并且该进程创建的文件归 root:staff 所有

我尝试用谷歌搜索这个问题,发现了很多帖子,比如有人想要他们的代理拥有 root 访问权限(在我看来这是“错误的”),并且他们在论坛上发布了关于“我怎样才能给它根“每个人都在回复解释”它没有获得 root 权限,它是一个用户代理“...这是我所期望的,然而我却遇到了相反的问题,我希望该代理具有 root 访问权限,它不应该拥有它,但它确实拥有它。

如果答案是“你根本无法使用 sudo 运行 launchctl load,否则会发生这种情况“,我找不到任何相关记录。如果是这种情况,那么我该如何从守护进程对代理执行 launchctl unload/load 操作呢?应该具有 root 访问权限,这是我需要做的事情,以便产品能够自行更新?

编辑:这里有一个常见链接帖子的例子,它使得这看起来根本不应该是一个问题,听起来即使你愿意,代理也不可能以 root 身份运行……https://superuser.com/a/36173/603140

答案1

launchd 为每个用户会话维护一个单独的项目列表(“启动代理”),并为系统上下文维护一个项目列表(“启动守护进程”)。当您launchctl load以 root 身份运行时,该项目将加载到系统列表中(即作为启动守护进程而不是代理)无论文件位于何处。您需要做什么取决于您到底想完成什么:

  • 如果您尝试让该项目作为启动代理加载到未来的用户会话中(即下次登录时),只需将其放入 /Library/LaunchAgents,正确设置权限,然后高枕无忧。当用户登录时,它会扫描该目录并加载它找到的任何内容。

  • 如果你尝试将该项目加载到现有的登录会话中,则需要运行launchctl load 在该届会议上。这到底意味着什么以及如何做到这一点很复杂,可能取决于您正在运行的 OS X 版本(Apple 一直在更改 launchd 架构...)。至少在旧版本的 OS X 中,您必须找到在目标会话中运行的某个进程的进程 ID,然后运行类似以下操作:

    sudo launchctl bsexec $PIDInTargetSession sudo -u $TargetUsername launchctl load /Library/LaunchAgents/youritem.plist
    

    解释:首先sudo切换到 root,然后launchctl bsexec $PIDInTargetSession切换到目标会话的 mach 引导上下文(我说过这很复杂),然后sudo -u $TargetUsername将 UID 从 root 切换到目标用户,然后最后launchctl load /Library/LaunchAgents/youritem.plist在该会话中加载代理。

如果不行,请检查这条信息寻找一些替代方案。

相关内容