gpt4 book ai didi

objective-c - 在 OS X 中使用 NSTask 在特定用户下运行 "launchctl"命令

转载 作者:太空狗 更新时间:2023-10-30 03:53:58 25 4
gpt4 key购买 nike

我的应用程序在 root 下启动,我需要能够使用 NSTask 和 launchctl 卸载进程这是我做的代码:

    NSPipe *pipe = [NSPipe pipe];

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/launchctl"];
[task setCurrentDirectoryPath:@"/"];
[task setStandardError:pipe];

NSLog(@"/bin/launchctl unload %@", plistAutostartLocation);

NSArray *arguments;
arguments = [NSArray arrayWithObjects: enableCommand, plistAutostartLocation, nil];
[task setArguments: arguments];

NSFileHandle * read = [pipe fileHandleForReading];

[task launch];
[task waitUntilExit];

如果需要卸载的进程是在“root”下启动的,那么即使没有失败,它也会成功卸载。问题是如何在特定用户(例如“myusername”)下运行“launchctl”?

编辑:在终端中,如果我想在特定用户下运行一些命令,我​​接下来会执行并且效果很好:

su - myusername -c "ls /Users/myusername"

但是当我尝试在特定用户下运行“launchctl”时失败了:

su - myusername -c "launchctl load /Library/LaunchAgents/com.google.keystone.agent.plist"

它说:“找不到要加载的内容”

最佳答案

您最后一条命令的失败与引导命名空间有关,您正试图在错误的引导命名空间中加载代理。系统正在创建两个不同的引导命名空间,摘自 Apple documentation :

It's worth noting the distinction between GUI and non-GUI per-session bootstrap namespaces. A GUI per-session bootstrap namespace is instantiated by the GUI infrastructure (loginwindow and WindowServer) when a user logs in via the GUI. A non-GUI per-session bootstrap namespace is created when a user logs in via SSH. While there is no fundamental difference between these namespaces, GUI-based services, like the Dock, only register themselves in GUI per-session bootstrap namespaces.

su命令未在 launchd 使用的同一个 bootsrap 命名空间中启动.

有两种方法可以在正确的引导命名空间中运行您想要运行的命令:

  • 10.10 及更高版本:使用 launchctl asuser .这将运行由指定 <myusername> 启动的任何命令.值得一提的是,您必须以 root 身份运行它,否则该命令将失败。你的最后一个命令应该像这样运行:

     launchctl asuser <myusername> launchctl load "/Library/LaunchAgents/com.google.keystone.agent.plist"
  • 10.10 及以下版本(自 10.11 起,SIP 阻止此方法):使用 launchctl bsexec .这需要一个进程 ID 来检索正确的 namespace ,以在其中运行另一个命令。此外,您必须手动更改命令的 UID,如下所示:

    launctl bsexec <pid> su -u <myusername> launchctl load "/Library/LaunchAgents/com.google.keystone.agent.plist"

关于objective-c - 在 OS X 中使用 NSTask 在特定用户下运行 "launchctl"命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24121303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com