¿Cómo puedo iniciar un proceso daemon como un usuario específico en el arranque sin un inicio de sesión interactivo?

Estoy intentando configurar un TeamCity Build Agent en un Mac Mini Server con 10.7.3. Lo hice ejecutar y compilar con éxito, pero solo si inicio sesión y ejecuto el proceso manualmente.

Preferiríamos que el proceso se iniciara al inicio, lo que parece fácil de hacer colocando un archivo plist en la carpeta /Library/LaunchDaemon. Desafortunadamente, esto no funciona para nosotros ya que el proceso se activa como root en lugar de nuestro usuario especificado. Realmente preferiríamos mantener las cosas restringidas a la carpeta del usuario y, además, necesitar acceso a un llavero para manejar la mecánica de firma de código de iOS. Desafortunadamente, el uso de ~/Library/LaunchAgents no funciona, ya que parece requerir que alguien visite la terminal e inicie sesión; esto debe iniciarse desde el arranque y seguir ejecutándose cuando el usuario cierra la sesión.

¿Hay alguna forma de iniciar un proceso como un usuario específico en el arranque?

Respuestas (2)

Puede ejecutar fácilmente como otro usuario sudo -uasí:

#!/bin/sh

UZER=jsmith

sudo -u "$UZER" /path/to/program/you/want/to/run

exit 0

Simplemente cambie 'jsmith' al nombre de usuario corto apropiado, y luego guárdelo como un script en algún lugar, y llame desde /Library/LaunchDaemons

Recuerde que todos los archivos en /Library/LaunchDaemons deben ser propiedad de root para ejecutarse.

(Creo que esto es lo que bmike estaba sugiriendo)

Otra opción

Sin embargo, escribí un CÓMO para hacer que el inicio de sesión automático sea más seguro:

Terminally Geeky: use el inicio de sesión automático de forma más segura

El resumen ejecutivo es este:

  • Activar Inicio de sesión automático
  • Ponga este plist de lanzamiento en ~/Library/LaunchAgents
  • Reiniciar

Que hace:

Tan pronto como inicie sesión, launchd lo llevará de regreso a la pantalla de inicio de sesión usando:

"/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession" -suspend

Tenga en cuenta que es todo una línea larga.

Teniendo en cuenta que alguien con acceso físico a su computadora tiene muchas vulnerabilidades potenciales, considero que esto es relativamente seguro, pero, por supuesto, cada uno debe tomar su propia determinación. Ejecuto esto en mi pequeña oficina, pero mi iMac está en mi oficina privada que puedo bloquear cuando no estoy allí.

También tenga en cuenta que el inicio de sesión automático no funciona con FileVault 2 .

¿Ejecutar sudo -u obtiene acceso al llavero para el usuario especificado?
Eso no lo sé. Puede probar la securityherramienta para ver si puede acceder a ella de esa manera.
Al final, el inicio de sesión automático con su cierre de sesión fue lo suficientemente bueno para nuestros propósitos.

La manera fácil es configurar a ese usuario para que inicie sesión automáticamente y luego bloquear la pantalla con el cambio rápido de usuario habilitado. De lo contrario, tendrá que hacer el trabajo duro de crear un usuario de nivel de administrador y hacer que su secuencia de comandos o proceso se inicie solo con un usuario específico.

Los procesos iniciados antes de que comience la sesión de inicio de sesión del usuario son funcionalmente raíz y deben degradarse si no desea que se ejecuten como raíz. Apple hace esto con el servidor web y el usuario _www y en el lado del cliente, algunos procesos se ejecutan como usuarios none, _spotlight y _mdnsresponder.

Entendido. La primera opción suena realmente fea, ¿hay alguna documentación sobre cómo hacer la última opción?
Comenzaría con developer.apple.com/library/mac/#documentation/MacOSX/… para la documentación. Es denso, por lo que ha considerado simplemente cambiar su daemon para elegir sudoal usuario en lugar de iniciarlo como una tarea heredada. No lo he probado últimamente, pero es rápido y podría funcionar.