Мне нужно иметь возможность запускать/останавливать агент GUI за сеанс от демона уровня корня.
Подобные проблемы обсуждаются здесь, здесь и здесь.
То, что я хочу сделать, это в основном
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
но это только запускает/останавливает один экземпляр и запускается как root в текущем сеансе графического интерфейса пользователя. Если я оставлю sudo, начните, я получу
task_for_pid() (os/kern) failure
Couldn't switch to new bootstrap port: (ipc/send) invalid port right
Я попытался объединиться с множеством других перестановок bsexec (включая вызов вторичного script из bsexec с помощью команды load/unload), но я никогда не смогу запустить экземпляр как ничего, кроме root и никогда в другом сеансе графического интерфейса.
Я также попытался объединиться с su - <user> ...
и sudo -u <user> ...
, но не повезло и там (как многие люди обсуждали в вышеупомянутых связанных статьях и в других местах).
Есть ли у кого-нибудь мысли?
EDIT: Я попытался сделать это с помощью инструмента-обертки, как предложено ниже Грэмом Ли, но я получаю следующую ошибку:
launch_msg(): Socket is not connected
Это команда командной строки, обертка и script Я использую (501 - это идентификатор пользователя и 63093 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;
}
Script:
/bin/launchctl load -S Aqua /Library/LaunchAgents/com.company.agent.plist