¿Cómo hago una secuencia de comandos para forzar el cierre de sesión de otro usuario de escritorio de OS X?

1

Estamos ejecutando pruebas que requieren varios escritorios en una Mac Mini.

Estamos utilizando con éxito un túnel ssh TCP para localhost, 5900 a 6900, para que Screen Sharing nos permita iniciar sesión en otros usuarios en esta misma máquina con vnc: // usuario: password @ localhost: 6900 y algunos Applescript para presionar Los botones de diálogo resultantes. Puedo detectar el inicio de sesión exitoso a través de ssh ejecutando un programa bajo Java 1.7 con export AWT_TOOLKIT=CToolkit que intenta abrir una ventana AWT como usuario secundario, que falla si no se inicia el escritorio.

¡Esto es bastante confiable, aunque con mucho gusto escucharía sobre métodos más confiables!

Cuando las cosas van mal:

Estamos teniendo problemas para cerrar la sesión de los usuarios de robots, para dejar la máquina actualizada para otras pruebas que objeten a toda la memoria desperdiciada por procesos parásitos que los usuarios dejan en ejecución.

Actualmente estoy usando

for i in $users ; do
  ssh ${i}@localhost "osascript -e 'tell application \"System Events\"'
                                  -e 'log out'
                                  -e 'delay 3'
                                  -e 'keystroke return'
                                -e end" &
done; wait

pero a veces System Events aparentemente no se está ejecutando y se niega a iniciar:

33:40: execution error: System Events got an error: Application isn’t running. (-600)

Recientemente agregué -e 'if it is not running then launch' -e 'delay 5' inmediatamente antes del -e 'log out' pero eso no parece hacer mucho para ayudar.

Pensé que reemplazar todo ese material de Apple con una variante de ssh kill -KILL -1 funcionaría, al menos como respaldo para los usuarios de retención cuyo System Events está roto, pero deja un buen par de docenas de servicios CoreServices , PrivateFrameworks y Frameworks. Las cosas con apariencia de GUI que se ejecutan en la mayoría de los cuales se niegan a morir, incluso con kill -9 apuntado manualmente a sus PID. Me esforcé bastante con un script de dos etapas, capturando la salida de killall -s en un archivo y colocándola en una segunda sesión ssh.

¿Hay una manera más confiable de cerrar la sesión de estos usuarios y eliminar todos sus procesos? Tengo derechos de administrador en la caja, pero preferiría algo en la línea de comandos de Unix para evitar escribir AppleScript más doloroso para manipular la GUI.

¡Gracias!

    
pregunta android.weasel 11.03.2016 - 16:07

1 respuesta

0

Encontré lo que parece una ruta viable, pero es poco delicada:

Elimine el proceso 'loginwindow' para un usuario (como root: el usuario no puede eliminar su propio proceso (!)) (tenga en cuenta que [n] evita que la expresión regular coincida con la propia expresión), luego use kill -9 -1 para atrapar el lío restante:

    $ for i in $users; do
       echo $pword |
       ssh $i@localhost '
         sudo -S kill -9 $(
           ps -axf | awk "/^ *$(id -u '$i') .*logi[n]window/{ print \ }"
         );
         kill -9 -1
       ';
      done

Deja dos procesos alrededor

  • /System/Library/Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mdworker -s mdworker -c MDSImporterWorker -m com.apple.mdworker.shared
  • / usr / sbin / cfprefsd agent

... que según varias páginas de Mac son una rareza normal de OS X.

No me gusta particularmente esta solución, porque es muy abrupta y me preocupa dejar cosas como simuladores de teléfonos iOS u otros archivos en estados inconsistentes, pero al no haber otra respuesta, parece que no tengo otra opción. .

Al menos puedo usar esto como una copia de seguridad de emergencia para cuando falla la ruta Applescript, y el kill -9 -1 ordena lo que el proceso de cierre de sesión normal pero de mala calidad de Apple deja de lado de todos modos.

También notaré que hacer algo con múltiples usuarios de escritorio desordena la conectividad de la red para mí, aparentemente debido a que Apple no se molesta en pensar cómo deberían comportarse las redes autenticadas.

    
respondido por el android.weasel 13.03.2016 - 23:22

Lea otras preguntas en las etiquetas