gpt4 book ai didi

macos - 使用 GUI session 为所有用户启动/停止启动代理

转载 作者:行者123 更新时间:2023-12-04 02:00:58 25 4
gpt4 key购买 nike

我需要能够从根级守护程序启动/停止每个 session 的 GUI 代理。

讨论类似问题here , herehere .

我想要做的基本上是

for num in `ps ax | grep [s]bin/launchd | cut -c 1-5`; 
do
if [ $num -ne 1 ];
then
sudo launchctl bsexec $num launchctl (un)load -S Aqua /Library/LaunchAgents/com.mycompany.mydaemon.plist;
fi;
done

但这只会启动/停止一个实例,并且它在当前 GUI session 中以 root 身份运行。如果我离开 sudo 那里开始我得到
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right

我试过弄乱 bsexec 的各种其他排列(包括使用加载/卸载命令从 bsexec 调用辅助脚本),但我永远无法让实例以 root 以外的任何其他方式启动,也永远不会在另一个 GUI session 中启动.

我也试过弄乱 su - <user> ...sudo -u <user> ... ,但也没有运气(正如许多人在上面链接的文章和其他地方所讨论的那样)。

有人有什么想法吗?

编辑:
我尝试使用以下 Graham Lee 建议的包装器工具执行此操作,但出现以下错误:
launch_msg(): Socket is not connected

这是我正在使用的命令行命令、包装器和脚本(501 是用户 ID,63093 是登录到系统的另一个用户的 launchd 的 pid):

命令行:
sudo launchctl bsexec 63093 /path/TestSetUIDAndExecuteTool 501 /path/LoadBillingDialogAgent

包装:
#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

if (argc != 3) {
NSLog(@"Tool called with improper arguments");
return -1;
}

int uid = [[NSString stringWithUTF8String:argv[1]] intValue];
// TODO: REMOVE
NSLog(@"Setting uid to |%i|", uid);

setuid(uid);
// TODO: REMOVE
char *command = (char *)argv[2];
NSLog(@"Executing command |%s|", command);
system(command);

[pool drain];
return 0;
}

脚本:
/bin/launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist

最佳答案

使用 launchctl bsexec是正确的,但您需要启动一个包装工具,在运行“真实”代理可执行文件之前将 UID 发送给目标用户。哦,最好找 loginwindow进程,因为它们是登录 session 的领导者(尽管 launchd 也很可能起作用)。

关于macos - 使用 GUI session 为所有用户启动/停止启动代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1106638/

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