macos shell applescript

macos - OSX: comprueba si la pantalla está bloqueada



shell applescript (1)

¿Hay alguna forma de verificar si la pantalla está bloqueada en shell o applecript? No solo compruebe si el protector de pantalla se está ejecutando, sino que la pantalla está bloqueada con la configuración de ahorro de energía o presionando ⌃⇧⏏ ( Mayús + control + expulsión ).

Gracias de antemano.


Primero, hay un poco de confusión en tu pregunta. Tanto Shift + Control + Eject como Energy Saver ponen las pantallas en modo de suspensión, que no es lo mismo que bloquearlas. Dependiendo de sus otras configuraciones, esto también puede implicar bloquear la pantalla, pero eso es un problema aparte. IIRC, en Lion, de forma predeterminada, ninguno de los dos bloqueará la pantalla, pero si deja la pantalla inactiva durante más tiempo que el establecido en Seguridad y privacidad, eso lo bloqueará.

De todos modos, la API CGSessionCopyCurrentDictionary permite obtener información acerca de la suspensión de pantalla y el bloqueo de pantalla, para su sesión de GUI. Si no tiene una sesión de GUI (por ejemplo, porque está ejecutando en un shell ssh), o si su sesión no es la propietaria de la consola (por ejemplo, porque alguien lo ha cambiado rápidamente), ganó. No pueda obtener esta información, pero al menos podrá detectar esos casos.

Este es el único mecanismo que conozco que funciona para todos los sistemas operativos de 10.5 (en realidad, 10.3) a 10.8 (pero eso no significa que sea el único que realmente existe ...).

No hay una forma directa de llamar a esto desde bash o AppleScript. Sin embargo, puede usar su puente favorito (PyObjC, MacRuby, ASOC, etc.) para llamarlo indirectamente. Aquí hay un ejemplo usando Python:

#!/usr/bin/python import Quartz d = Quartz.CGSessionCopyCurrentDictionary() print d

Aquí está cómo interpretar la respuesta:

  • Si no obtiene nada, entonces no tiene una sesión de UI.
  • Si el diccionario tiene kCGSSessionOnConsoleKey = 0, o no está presente, su sesión de GUI no es la consola o las pantallas de la consola están inactivas.
  • Si el diccionario tiene CGSSessionScreenIsLocked = 1, las pantallas están bloqueadas.

El caso de un problema es que kCGSSessionOnConsoleKey es 0 (o falta) y CGSSessionScreenIsLocked es 1. En ese caso, ya sea que haya puesto las pantallas en suspensión y bloqueadas, o que otra persona haya tomado la consola y haya bloqueado las pantallas (con o sin Poniéndolos a dormir). Y no estoy seguro de si hay una manera de distinguir entre estos casos. Pero si está buscando "no intente mostrar un cuadro de diálogo porque el usuario primero tendrá que desbloquear la pantalla", ambos casos significan "no mostrar un cuadro de diálogo".

Entonces, esto debería darte lo que quieres:

#!/usr/bin/python import sys import Quartz d=Quartz.CGSessionCopyCurrentDictionary() sys.exit(d and d.get("CGSSessionScreenIsLocked", 0) == 0 and d.get("kCGSSessionOnConsoleKey", 0) == 1)

O, convirtiéndolo en una sola línea puede poner directamente en un script de shell:

python -c ''import sys,Quartz; d=Quartz.CGSessionCopyCurrentDictionary(); sys.exit(d and d.get("CGSSessionScreenIsLocked", 0) == 0 and d.get("kCGSSessionOnConsoleKey", 0) == 1)''

Ahora, ¿qué pasa si has ssh''d en una Mac, y también estás conectado actualmente en la consola GUI de esa Mac (como el mismo usuario)? En ese caso, su sesión de inicio de sesión ssh puede comunicarse con la sesión de inicio de sesión de la consola exactamente de la misma manera que lo haría una sesión de inicio de sesión de Terminal local. Entonces, CGSessionCopyCurrentDictionary va a obtener los mismos valores.

El servidor bootstrap que media esa conexión aplicará algunas restricciones (por ejemplo, security authorize -u foo debería funcionar desde la Terminal pero no a través de ssh), pero esas no están completamente documentadas, y cambian de una versión a otra, por lo que probablemente no sea algo quieres confiar en En su lugar, desea leer la información de su sesión de inicio de sesión.

Si desea ir más allá con esto, comience por leer los Temas de programación de entornos de múltiples usuarios . Pero parte de la información no está realmente documentada en ninguna parte (por ejemplo, cómo las sesiones a nivel de Mach a las que hace referencia SessionGetInfo y las sesiones a nivel de BSD a las que hace referencia utmpx están vinculadas). Muchas de las herramientas y bibliotecas relevantes son de código abierto , lo que puede ayudar. Incluso si leer todo eso no le dice cómo hacer lo que quiere, le dirá exactamente lo que quiere y los términos correctos que debe usar para buscar y hacer preguntas, lo cual puede ser lo suficientemente bueno.