Estoy tratando de descubrir cómo iniciar una aplicación GUI como otro usuario que ha iniciado sesión de forma interactiva, en la sesión gráfica de ese usuario.
Por ejemplo, digamos que tengo dos usuarios, foo y bar. Ambos están conectados, pero el usuario interactivo actual es foo. Me gustaría iniciar Calculator.app como usuario "barra", para que cuando el usuario cambie rápidamente a barra, encuentre que la ventana Calculadora está abierta en la sesión de barra.
Esto es lo que he probado que no funciona:
sudo -u bar /Applications/Calculator.app/Contents/MacOS/Calculator
Esto inicia Calculator.app como barra, pero la ventana se abre en la sesión gráfica de foo.
sudo -u bar osascript -e "tell application \"Calculator\" to activate"
Mismo efecto.
sudo -u bar open "/Applications/Calculator.app"
Inicia Calculator como foo, no bar.
launchctl asuser [uid of bar] [any of the above commands]
Mismo efecto.
¿Hay alguna forma de lograr esto? Estoy dispuesto a entretener todo tipo de soluciones posibles, incluidas las secuencias de comandos bash, AppleScript, escribir un programa Core Foundation o Cocoa, etc. En mi situación, cualquier programa o script podría ejecutarse como cualquier usuario, incluida la raíz.
Nota: Soy consciente de que es posible usar eventos remotos de Apple, pero no puedo usarlo ya que en la situación que estoy tratando de hacer esto no tengo garantía de que "Eventos remotos de Apple" esté habilitado en Compartir preferencias.
Cualquier ayuda sería muy apreciada!
fuente
open
comando usandoSSH
?Respuestas:
Lo que quieres lograr es posible pero difícil. Debe iniciar la aplicación dentro de la sesión de usuario adecuada. Por razones de seguridad, cruzar la división de la sesión del usuario es difícil.
Necesita un proceso que ya se esté ejecutando en la sesión del otro usuario para escuchar su solicitud e iniciar la aplicación en su nombre.
bsexec de launchd
Afortunadamente, las versiones recientes de
launchd
tienen esta capacidad; aunque los ingenieros de Apple no han recomendado su uso general. Use labsexec
opción en launchctl para apuntar a la sesión de usuario adecuada:El enfoque recomendado es escribir un ticket de trabajo lanzado y reiniciar la Mac, o pedirle al usuario que cierre sesión y vuelva a iniciarla.
Causa de los problemas
Los problemas provienen de que la aplicación está conectada al
WindowServer
proceso incorrecto . Cada sesión de usuario tiene un WindowServer separado; Este proceso maneja la interfaz de usuario. Sus métodos anteriores colocan la propiedad del proceso con el usuario correcto pero conectado a su propio proceso WindowServer.Este problema se menciona en la nota técnica de Daemons and Agents de Apple.
Experiencia
Sé esto por experiencia personal. Para Power Manager, escribí pmuser para que exista dentro de cada sesión de usuario.
pmuser
escucha nuestro demonio y maneja los lanzamientos y comandos por usuario. A pesar de que nuestro demonio tiene autoridad de root, todavía necesitábamos un proceso por usuario para trabajar de manera confiable dentro de las sesiones de usuario.fuente
Ninguna de las respuestas de bsexec anteriores funciona en El Capitan (10.11), debido a que la Protección de integración del sistema (SIP) cierra los puertos. "launchctl asuser" funciona, pero debe ejecutarse como root. El siguiente comando funciona en El Capitan (y los sistemas operativos más recientes):
Tenga en cuenta que 501 es el ID de usuario para mi otro usuario.
fuente
bruno.medeiros@brunojcm-macbook:~ $ sudo launchctl asuser 501 open /Applications/Firefox.app
y obtuveLSOpenURLsWithRole() failed with error -600 for the file /Applications/Firefox.app
sudo launchctl asuser $(id -u <user_id_name>) <app>
. Dicho esto, me sale un error diferente deposix_spawn(): 13: Permission denied
incluso si me encuentro con el mismo ID de usuario que estoy conectado con (y es propietaria de la sesión) parasudo launchctl asuser $(id -u mtylutki) /Applications/Calculator.app
Como finalmente 10.10 proporciona una implementación correcta "launchctl bsexec" que puede usar:
el hombre dice
Entonces, como parámetro PID, puede usar el pid del proceso de ventana de inicio de sesión apropiado . El UID es la identificación de usuario del usuario que posee esa ventana de inicio de sesión y el GID es su grupo primario.
Esto funciona bien para cualquier comando y, por supuesto, para los trabajos de lanzamiento (por ejemplo, lanzadores) también, por fin, como:
fuente
task_for_pid(): 0x5
ahora recibo un error para esto, donde he verificado que el PID es correcto.Puede usar el Finder como el host para los permisos correctos
osascript -e "tell application \"Finder\" to open (\"${app}\" as POSIX file as alias)"
. De esa manera, se lanzará a través del contexto GUI lanzado Finder.fuente
Esto funciona a través de ssh:
pero si lo prueba a través de Terminal.app, abre TextEdit en la GUI del usuario actual.
Si no está seguro de que
ssh
esté habilitado, quizás pueda habilitarlo temporalmentey deshabilitarlo nuevamente si es necesario?
De lo contrario estoy perplejo.
Probado en 10.9.
fuente
Sencillo
luego ejecute los comandos normalmente.
fuente
bar
, pero aún se ejecutarían enfoo
la sesión gráfica.