6 votos

Dando permisos de grabación de pantalla a un shell script llamado por launchd

Dado un shell script que llama a la utilidad de captura de pantalla de MacOS, se produce una captura de pantalla adecuada (es decir, una captura completa de lo que hay en la pantalla, incluyendo cualquier aplicación Windows visible) cuando se llama a ese shell script desde el terminal. Sin embargo, el uso de launchd para llamar periódicamente a la misma script no produce el resultado deseado, en este caso la captura de pantalla sólo muestra un fondo de escritorio vacío y una barra de menú. Estoy ejecutando MacOS 12.5 Monterey.

Mi objetivo es tomar capturas de pantalla automáticamente usando launchd para llamar a un shell script periódicamente. Específicamente quiero llamar a un shell script o archivo ejecutable unix, y no quiero utilizar cron o cualquier otra aplicación que no sea launchd para fines de programación. Mi captura de pantalla real shell script es más complicado que en el ejemplo. En el pasado he sido capaz de cargar con éxito otros demonios llamando a shell script como en el ejemplo a través de launchctl, pero nunca me había encontrado con problemas de permisos como este.

Ejemplo

screenshot.sh

#!/bin/zsh

# save as `~/Library/bin/screenshot.sh`
# make executable by ways of the following command: `chmod +x ~/Library/bin/screenshot.sh`

screencapture -C ~/Desktop/test$( date +'%H%M%S' ).png;

Guarde este script en ~/Library/bin/ y hacerlo ejecutable llamando a chmod +x . Tenga en cuenta que llamar a ejecutar este script funciona bien si se ha dado a Terminal.app (o equivalente...) grabación de pantalla (véase "Permisos" más abajo).

com.example.screenshot.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
  save as `~/Library/LaunchAgents/com.example.screenshot.plist`
  load this by ways of the following command: `sudo launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist`
  unloading this: `sudo launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist`
-->
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.example.screenshot</string>

    <!-- replace <<USERNAME>> with the actual username -->
    <key>Program</key>
    <string>/Users/<<USERNAME>>/Library/bin/screenshot.sh</string>

    <key>StartInterval</key>
    <integer>10</integer>

    <key>ProcessType</key>
    <string>Background</string>

    <key>StandardErrorPath</key>
    <string>/tmp/launchd.example.screenshot_stderr.log</string>
    <key>StandardOutPath</key>
    <string>/tmp/launchd.example.screenshot_stdout.log</string>
  </dict>
</plist>

En primer lugar, asegúrese de que en <key>Program</key> <NOMBRE DE USUARIO> esté configurado con su nombre de usuario real, o que la ruta al archivo screenshot.sh sea absoluta. Guarde este .plist en ~/Library/LaunchAgents/ y carga llamando a sudo launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist . La descarga funciona cambiando el subcomando a arranque . La página de manual de launchctl se encuentra en aquí .

Permisos

Se pueden dar permisos de grabación de pantalla a las aplicaciones en Preferencias del Sistema Seguridad y Privacidad Privacidad Grabación de pantalla '+'. Añadiendo Terminal.app a esta lista, y reiniciando la aplicación se obtienen capturas de pantalla correctas cuando se llama a screenshot.sh directamente desde el terminal. He intentado añadir /bin/launchd, /bin/launchctl, /usr/sbin/screencapture, Terminal.app, y el screenshot script (guardado sin el sufijo .sh) a la lista de aplicaciones permitidas y luego reiniciar, pero todavía no soy capaz de producir capturas de pantalla adecuadas a través de launchd.

Pregunta resumida

Para la configuración anterior, ¿qué ajustes debo cambiar o qué permisos debo conceder para obtener capturas de pantalla adecuadas que muestren las aplicaciones abiertas?

Se han formulado preguntas relativas al mismo problema aquí y aquí pero las respuestas no son satisfactorias (no funcionan o no utilizan launchd).

7voto

SkRevo Puntos 56

He estado trabajando en lo mismo y finalmente lo descubrí después de mucho cavar y probar.

He visto que en los CoreServices hay una aplicación launchservicesd. He añadido esto a los permisos de grabación de pantalla y funciona.

Se encuentra exactamente aquí: /System/Library/CoreServices/ y estás buscando exactamente launchservicesd para dar permisos.

Para aquellos que lean esto y no sepan cómo añadir estas opciones a Screen Recording, deben utilizar Comando+Mayús+G para abrir un menú desplegable en las Preferencias y elegir estas ubicaciones específicas.

En total necesitará tener permisos de Grabación de Pantalla para todo lo siguiente:

/bin/bash

/System/Library/CoreServices/launchservicesd

/usr/sbin/screencapture

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X