Como eu inicio um processo como usuário específico na inicialização do OS X?

7

Eu gostaria de executar um script como um usuário específico na inicialização (não no login). Eu pensei que um launchd LaunchDaemon faria isso, mas 'man launchd' diz:

"Se você deseja que seu serviço seja executado como um determinado usuário, no ambiente desse usuário, torná-lo um agente launchd é o ÚNICO meio suportado de realizar isso no Mac OS X. Em outras palavras, não é suficiente executar um setuid (2) para se tornar um usuário no verdadeiro sentido do Mac OS X. "

Eles não estão brincando - quando tento executar meu script como um LaunchDaemon, ele não funciona. Em particular, estou tentando automatizar algumas operações de keychain usando o comando 'security', e ele não me permite alterar as chaves padrão quando executo o script através do LaunchDaemon, embora o script funcione bem quando executado usando sudo de um shell.

Um LaunchAgent não funcionará, porque o objetivo é que o processo seja executado sem o login do usuário e o LaunchAgents seja executado apenas quando alguém fizer login. Eu olhei para o cron e a diretiva @reboot e isso parece promissor, mas eu li que o cron está obsoleto no OSX.

    
por Scott Bonds 08.11.2011 / 09:32

3 respostas

9

Eu tive problemas semelhantes tentando fazer um processo de longa execução usar um chaveiro padrão. Essencialmente, o LaunchAgent parece não rodar em um ambiente de login completo para executar os comandos de segurança, portanto, a alteração do conjunto de chaves padrão não funciona e retorna com um erro de permissões no diretório /Library/Preferences/ .

O molho secreto é adicionar:

<key>SessionCreate</key>
<true/>

para o seu plist. Este é um recurso não documentado que forçará um ambiente adequado e permitirá que você defina o conjunto de chaves padrão. Crédito para joensson em esta questão por me apontar na direção certa.

    
por 19.03.2012 / 19:21
1

Existem inúmeros outros locais onde você pode ocultar itens de inicialização no OS X (a maioria deles que são completamente sem suporte). Eu tentaria /etc/rc.local ; Parece que me lembro de trabalhar no Panther, então há uma possibilidade de que ainda funcione hoje.

    
por 09.11.2011 / 08:51
1

Salve como um daemon global ( /Library/LaunchDaemons ) e especifique o usuário com a chave UserName :

<key>UserName</key>
<string>Put username here</string>
    
por 02.05.2017 / 06:31