2012-07-16 33 views
14

¿Hay alguna forma de comprobar si la pantalla está bloqueada en el shell o applescript? No sólo comprobar si salvapantallas está corriendo, pero la pantalla está bloqueada por la configuración de ahorro de energía o pulsando ^⇧⏏ (cambio de control + + expulsión).OSX: compruebe si la pantalla está bloqueada

Gracias de antemano.

Respuesta

20

Primero, hay un poco de confusión en su pregunta. Tanto Shift + Control + Eject como Energy Saver apagan las pantallas, lo que no es lo mismo que bloquearlas. Dependiendo de sus otras configuraciones, esto también puede implicar el bloqueo de la pantalla, pero ese es un problema aparte. IIRC, en Lion, de manera predeterminada, ninguno de los dos bloqueará la pantalla, pero si deja la pantalla dormida durante más tiempo que el establecido en Seguridad & Privacidad, eso lo bloqueará.

De todos modos, la API CGSessionCopyCurrentDictionary le permite obtener información sobre la función de suspensión de pantalla y bloqueo de pantalla para su sesión de GUI. Si no tiene una sesión de GUI (por ejemplo, porque se está ejecutando en un shell ssh), o su sesión no es propietaria de la consola (por ejemplo, porque alguien le ha desconectado rápidamente), no ganó ser capaz de 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 desde 10.5 (en realidad 10.3) hasta 10.8 (pero eso no significa que sea el único en realidad ...).

No hay una manera directa de llamar 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í es cómo interpretar la respuesta:

  • Si recibe nada a cambio, entonces usted no tiene una sesión de interfaz de usuario.
  • Si el diccionario tiene kCGSSessionOnConsoleKey = 0, o no está presente, la sesión de su GUI no es propiedad de la consola o las pantallas de la consola están inactivas.
  • Si el diccionario tiene CGSSessionScreenIsLocked = 1, las pantallas están bloqueadas.

El caso uno de los problemas es donde kCGSSessionOnConsoleKey es 0 (o falta) y CGSSessionScreenIsLocked es 1. En ese caso, ya sea que haya puesto las pantallas para dormir y los encerró, o alguien más ha tomado la consola y bloqueado las pantallas (con o sin ponerlas 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 tendrá que desbloquear primero la pantalla", ambos casos significan "no mostrar un cuadro de diálogo".

lo tanto, esto debe darle lo que quiere:

#!/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éndola en una sola línea se 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, lo que si has entrado en una Mac, y eres también actualmente conectado a la consola de la GUI de esa Mac (como el mismo usuario)?En ese caso, la sesión de inicio de sesión de ssh se puede comunicar 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 la Terminal local. Entonces, CGSessionCopyCurrentDictionary obtendrá los mismos valores.

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

Si quiere ir más lejos con esto, comience leyendo Multiple User Environments Programming Topics. Pero parte de la información no está realmente documentada en ninguna parte (por ejemplo, cómo las sesiones de nivel Mach referenciadas por SessionGetInfo y las sesiones de nivel BSD referenciadas por utmpx están unidas). Muchas de las herramientas y bibliotecas relevantes son open source, 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 que puede ser suficiente.

+0

Me refiero a "bloqueo" porque cualquiera de estos estados bloquea mi computadora debido a la configuración de seguridad (inmediatamente requiere contraseña para dormir y protector de pantalla). Y gracias por la respuesta detallada. En realidad, resolví mi tarea analizando _ioreg -n IODisplayWrangler_ para conocer el estado actual de la energía. – LevB

+0

Gracias por esto; Estaba tratando de averiguar si el usuario estaba en una sesión GUI o no, y el módulo python Quartz parece muy útil. (lamentablemente, cuando estoy SSH en una Mac, el fragmento de script devuelve exactamente el mismo resultado que cuando estoy en la consola de la GUI). Sé que puedo verificar las variables de entorno específicas de SSH, pero quería obtener más precisión ... – mpontillo

+0

Como mi comentario es demasiado largo para caber, lo agregaré a la respuesta anterior. – abarnert

Cuestiones relacionadas