Induzca el inicio de sesión gráfico de Mac desde SSH

16

¿Cómo induzco el inicio de sesión gráfico de Mac desde SSH? ¿Hay alguna manera de hacer que el loginwindowproceso inicie una sesión de usuario ejecutando un comando cuando inicie sesión de forma remota a través de SSH como administrador en Mac OS X?

Cuando la máquina se encuentra en la ventana de inicio de sesión (ningún usuario está conectado actualmente), quiero que abra la sesión de un usuario como si hubiera hecho clic en el nombre de usuario e ingresado una contraseña.

Las soluciones que no implican la creación de scripts de la GUI son muy preferidas, pero esta página KB de Apple puede ser de interés para aquellos que siguen esa ruta.

Sophie Alpert
fuente

Respuestas:

4

No saber la contraseña complica las cosas, pero tal vez la solución es: ¿ es posible borrar temporalmente la contraseña de un usuario? (Y luego restablecerlo a lo que era antes).

Como un inicio:

Primero, obtenga la ventana de inicio de sesión para mostrar. Simplemente cierre la sesión del usuario actual, use el cambio rápido de usuario o use SSH:

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

O, para cambiar a un usuario específico de inmediato, lo que probablemente mostrará la ventana de inicio de sesión (esto de repente ya no funciona en mi 10.5 Leopard):

sudo ./CGSession -switchToUserID 501

Lo que se muestra ahora depende un poco de las Preferencias del sistema, pero supongamos que son los iconos de los usuarios y sus nombres. Para activar un nombre, tendríamos que escribir las primeras letras. Luego, después de Volver, se muestra el mensaje de contraseña. Alternativamente, uno puede seleccionar cualquier nombre (como presionar la flecha hacia abajo) y luego presionar Opción-Retorno para que se le solicite cualquier nombre de usuario y su contraseña. No sé cómo se puede saber qué pantalla se muestra, pero guardemos eso para más tarde ...

Entonces, para seleccionar el primer nombre de usuario (aleatorio) y presionar Opción-Retorno, escriba un nombre de usuario específico, presione Retorno y escriba la contraseña:

sudo osascript -e 'tell app "Eventos del sistema"
  código clave 125
  pulsación de tecla usando la opción hacia abajo
  pulsación de tecla "el nombre de usuario"
  retraso 1.0
  tecla de retorno
  retraso 1.0
  pulsación de tecla "la contraseña"
  retraso 1.0
  tecla de retorno
fin decir '

Lo anterior muestra algún error, que por lo que puedo decir no limita el uso:

osascript [285]: 3891612: (connectAndCheck) Las aplicaciones no confiables no son 
    permitido conectarse o iniciar Windows Server antes de iniciar sesión.
_RegisterApplication (), NO SE PUEDE establecer la conexión predeterminada a
    WindowServer, _CGSDefaultConnection () es NULL.

Alternativamente, use la secuencia de comandos específica del idioma de " Ejecutar la ventana de inicio de sesión a través del Escritorio remoto de Apple " (tal vez algún día los comentarios en ese sitio muestren una mejor solución):

tell proceso "SecurityAgent"
  establecer el valor del campo de texto 1 del grupo 1 de la ventana 1 en "el nombre de usuario"
  establecer el valor del campo de texto 2 del grupo 1 de la ventana 1 a "la contraseña"
final decir
haga clic en el botón "Iniciar sesión" de la ventana 1 del proceso de solicitud "SecurityAgent"

Pero el problema principal es: esto todavía necesita la contraseña . Sin embargo: obviamente, no se necesita contraseña cuando un usuario tiene una contraseña en blanco. De hecho, para contraseñas en blanco, solo hacer clic en el icono de un usuario es todo lo que se necesita. Entonces, si el envío de pulsaciones de teclas usando AppleScript es aceptable, entonces tal vez "todo" lo que queda por resolver:

  • ¿Es posible borrar temporalmente la contraseña de un usuario para permitir iniciar (o reanudar) la sesión sin saber esa contraseña ...?

  • ¿Se puede hacer que el AppleScript sea a prueba de errores? Me gusta:

    • ¿Cómo saber si la ventana de inicio de sesión está visible? (tal vez stat -f%Su /dev/consolepueda ayudar, ya que eso cederoot mientras se muestra la ventana de inicio de sesión)
    • Como decir qué ventana de inicio de sesión se muestra? (Como: ¿uno que muestre iconos y nombres de inicio de sesión, o una lista desplegable, o tal vez solo una solicitud de contraseña si alguien seleccionó cambiar a un usuario específico?)
    • Deshágase de los retrasos.
    • ¿Qué pasa con ese mensaje de error?

(Una nota para la prueba: cuando se usa Compartir pantalla, parece que establecer la preferencia Al controlar las computadoras: Cifrar contraseñas y pulsaciones de teclas también conserva la conexión cuando se muestra la ventana de inicio de sesión, o después de que un usuario haya iniciado sesión correctamente. Cuando se utiliza Cifrar toda la red datos, entonces mi Mac necesita restablecer la conexión de pantalla compartida cada vez que se muestra un inicio de sesión o se cambia un usuario).

Arjan
fuente
Este es un buen comienzo, pero tiene dos problemas. Primero, no funciona si estás en la ventana de inicio de sesión, que es lo que quería, y pide una contraseña, que preferiría que no. Como es root, debería poder cambiar de usuario sin la contraseña.
Sophie Alpert
Ajá. Ni siquiera sé cómo iniciar sesión como otro usuario cuando estoy sentado en la computadora, así que no hay cigarro sudo osascript -e 'tell app "System Events" to keystroke "password" & return'. Con la pantalla bloqueada, ingresar un nombre de usuario administrativo y una contraseña reanuda la sesión del otro usuario. ¿Pero cómo iniciar una sesión para cualquier usuario sin conocer la contraseña? (Sólo para estar seguro, si conoce la contraseña: Otra solución podría ser la pantalla compartida, que también trabaja para la pantalla de inicio de sesión Tendrá que volver a conectar la pantalla compartida después de una sesión específica de usuario se inicia o se reanuda..)
Arjan
Esto es bueno. Sin embargo, preferiría una solución sin simular pulsaciones de teclas manualmente.
Sophie Alpert
2
Me pregunto si alguien sabe cómo iniciar una sesión para otra persona. Entonces, sin considerar la respuesta anterior, solo en el uso diario de Mac OS X: ¿ puede un administrador iniciar sesión como otro usuario, sin conocer la contraseña de ese usuario? (Al igual que suen el símbolo del sistema, pero luego para una sesión de GUI. O simplemente como cuando la pantalla está bloqueada, donde al ingresar un nombre de usuario administrativo y contraseña se reanuda la sesión del otro usuario.)
Arjan
Tal vez no sea posible hacerlo sin la combinación de teclas AppleScript: docs.info.apple.com/article.html?path=RemoteDesktop/3.0/en/…
Sophie Alpert
1

He estado investigando esto recientemente.

Ponga esto en la pila PAM de su aplicación, o pruebe con sshd:

session    required       pam_launchd.so launchd_session_type=Aqua

Eso contribuye en gran medida a obtener una sesión gráfica que está bastante cerca de una sesión de usuario desconectada. En particular, está en el espacio de nombres de bootstrap correcto y tiene los puertos de bootstrap correctos (creo). Puede verificar la fuente de lo que hace pam_launchd; usa una biblioteca privada de aspecto razonable (funciones vproc_priv.h en libvprop) para llamar a las rutinas de Mach para configurar los puertos y el espacio de nombres. Coincide con todos los documentos (limitados) que Apple proporciona para las llamadas al sistema derivadas de Mach.

A continuación, debe configurar su ID de usuario de auditoría a la del usuario con la API BSM, o la ventana de inicio de sesión no le hablará en Lion.

La sesión se parece mucho a una sesión desconectada ahora si marca "launchctl blist", y algunos procesos y servicios cobran vida (como el tablero de cartón, etc.). De hecho, todo excepto Finder y loginwindow se está ejecutando. Sin embargo, hasta que la ventana de inicio de sesión se ejecute, no puede iniciar una aplicación gráfica, y el proceso de ventana de inicio de sesión por sesión siempre se genera como un elemento secundario directo de la global. ¿Cómo se empuja el proceso de la ventana de inicio de sesión para iniciar una nueva ventana de inicio de sesión en la sesión nueva? ¡No puedo encontrar una manera de poner la última pieza en su lugar!

Cualquier ayuda para completar esta respuesta recibió con gratitud.

Nicholas Wilson
fuente
0

ejecutar el comando con sudo le permite configurar el script como ilegible para los usuarios estándar. No es perfecto, pero si tu usuario administrador ya está comprometido, ¡el juego termina de todos modos!

chmod ur scriptname

mi script se ve así, funciona de forma remota cuando un usuario ya se está ejecutando, para cambiar a un segundo usuario a través de SSH (probado en Snow Leopard 10.6.3):

#!/bin/bash
#go to login window
/System/Library/CoreServices/Menu\ Extras/User.menu/Contents/Resources/CGSession -switchToUserID 503

osascript -e 'tell app "System Events"
keystroke "password"
  delay 1.0
  keystroke return
end tell'

exit
zeigerpuppy
fuente
0

Necesitaba registrar al mismo usuario en 25 estaciones de trabajo diferentes, para poder realizar una actualización de software. No pude ejecutar el comando 'osascript -e ...' de manera confiable desde sesiones SSH, incluso con privilegios de sudo. Sin embargo, pude ejecutarlo a través de Apple Remote Desktop. Si tiene ARD:

  1. selecciona tus máquinas
  2. despertarlos y cerrar la sesión de otros usuarios, si es necesario
  3. elija "Enviar comando UNIX ..." en el menú "Administrar"
  4. pegue el script de Arjan (omitiendo la palabra 'sudo') en el cuadro de diálogo de comando
  5. seleccione e ingrese "Ejecutar comando como: Usuario: root"

Me encantó encontrar los 25 Mac Minis con Finder como usuario, en menos de un minuto. Solo para reiterar, con ARD no tiene que escribir la contraseña de sudo en cada máquina. Las líneas que necesita pegar en el cuadro de diálogo de comando son (sustituyendo un nombre de usuario y contraseña válidos):

osascript -e 'tell app "System Events"
  key code 125
  keystroke return using option down
  keystroke "the username"
  delay 1.0
  keystroke return
  delay 1.0
  keystroke "the password"
  delay 1.0
  keystroke return
end tell'
William H. Hooper
fuente