Acceso de asistencia cuando el agente ejecuta el script

3

Problema

Applescript ejecutado por osascript no está permitido El acceso de asistencia cuando lo ejecuta el agente ( ~/Library/LaunchAgents ). Aunque funciona cuando se ejecuta desde el editor de Apple o desde la línea de comandos directamente (usando osascript).

Situación

El applecript realiza varias tareas GUI para la impresión por lotes y se ejecuta dos veces al día. Por lo tanto, necesita permiso para acceder a Dispositivos de asistencia y es lanzado por un agente.

El script se ejecuta como se espera cuando se ejecuta desde:

  • Editor de Appleples
  • línea de comandos de osascript (no sudo)

Cuando es lanzado por el Agente, devuelve:

/location/of/my.scpt: execution error: System Events got an error: osascript does not have access to assistive devices. (-25211)

(Mensaje traducido del holandés por mí)

Esto me llevó a creer que el problema está en osascript, pero como dije anteriormente, funciona bien cuando se ingresa directamente desde la línea de comandos usando: osascript /location/of/my.scpt .

También, basado en estas dos publicaciones que edité /Library/Application\ Support/com.apple.TCC/TCC.db Base de datos SQLite y cuando verifico la tabla de 'acceso' se muestra:

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT * FROM access"
Password:
kTCCServiceAccessibility|com.logitech.gaming|0|1|0|??

kTCCServiceAccessibility|com.valvesoftware.steam|0|1|0|??

kTCCServiceAccessibility|com.blizzard.starcraft2|0|0|1|
kTCCServiceAccessibility|com.apple.AccessibilityInspector|0|1|0|??

kTCCServiceAccessibility|com.apple.ScriptEditor2|0|1|0|??

kTCCServiceAccessibility|com.apple.Terminal|0|1|0|??

kTCCServiceAccessibility|/usr/bin/osascript|1|1|1|
kTCCServiceAccessibility|com.my.label|0|1|1|
kTCCServiceAccessibility|/osascript|1|0|1|

Como puede ver, se permite el acceso a osascript y también agregué la lista de mi agente para una buena medida.

Causa posible?

¿Lo único en lo que puedo pensar es que, por algún motivo, el script es ejecutado por un 'usuario diferente' cuando lo ejecuta un Agente y, por lo tanto, se permiten diferentes dispositivos de asistencia? Sin embargo, parece poco probable, ya que TCC.db no parece ser específico del usuario y el agente se encuentra en ~/Library/LaunchAgents .

¿Ayuda, alguien?

    
pregunta Martin 28.02.2015 - 11:33

2 respuestas

3

Una solución simple es guardar el script como un archivo de texto en su lugar.

En la parte superior de la secuencia de comandos, agregue osascript shebang

#!/usr/bin/osascript

ejemplo:

#!/usr/bin/osascript
say "hello"
tell application "Safari" to activate
tell application "System Events"

    delay 2
    keystroke "p" using command down
    tell application process "Safari"

        tell application "System Events"
            tell process "Safari"
                click menu button "PDF" of sheet 1 of window 1
                delay 1

                click menu item "Save PDF to Web Receipts Folder" of menu of menu button "PDF" of sheet 1 of window 1
            end tell
        end tell
    end tell

end tell

En el cuadro de diálogo de guardar, selecciona Texto como formato de archivo. El archivo se guardará como texto simple, pero con la extensión .applescript .

En la terminal, haga que el archivo de texto guardado del script sea ejecutable.

He usado:

chmod +x /Users/UserName/Scripts/newTest1.applescript

En los argumentos de comando de LaunchAgent solo agrega la ruta al archivo.

No agregue el comando osascript a los argumentos. No lo necesitas.

El archivo de texto del script guardado actuará como un script de shell ejecutable.

Cuando cargue o ejecute por primera vez los Agentes de inicio, recibirá un mensaje para configurar el Acceso de asistencia en las Preferencias del sistema. Si ya tiene abiertas las preferencias del sistema, no lo hará, pero el archivo de texto Script se agregará a la lista.

Ahora solo tienes que marcar su casilla de verificación para permitirlo.

Volvería a cargar LaunchAgent para que se recupere de inmediato.

He comprobado esto con el script anterior y todo funciona como se esperaba.

    
respondido por el markhunte 28.02.2015 - 13:13
1

Si bien he aceptado la pregunta de @ markhunte porque funciona en el caso general, no funcionó para mí. Es por eso que publico mi propia solución como alternativa.

Crea un shellscript que inicie el applecript

Al hacer que el agente de inicio ejecute un shellscript que simplemente llame al applecript (.scpt), se debe permitir el acceso al shellscript a los dispositivos de asistencia una vez y el launchagent puede ejecutar el comando a su vez, para llamar al applecript. >

En mi caso, terminé con el siguiente LaunchAgent .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">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.mylabel.some-awesome-utility</string>
    <key>Program</key>
    <string>/Users/username/absolute/path/to/shellscript.sh</string>
    <key>StandardErrorPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/com.mylabel.some-awesome-utility.out</string>
    <key>StartCalendarInterval</key>
    <array>
        <dict>
            <key>Hour</key>
            <integer>06</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
        <dict>
            <key>Hour</key>
            <integer>20</integer>
            <key>Minute</key>
            <integer>05</integer>
        </dict>
    </array>
</dict>
</plist>

Este agente de inicio llamará al shellscript.sh dos veces al día según lo especificado por la clave StartCalendarInterval . También tenga en cuenta las claves StandardErrorPath y StandardOutPath que fueron útiles durante la depuración.

El shellscript.sh es extremadamente simple:

#!/bin/sh
osascript /Users/mnmt/Documents/InCuffs/Orders/PrepareShipping/print-shipping-labels.scpt

Como puede ver, una simple línea shebang para especificar que es realmente un shellscript seguido de una sola llamada al applecript que originalmente había estado llamando directamente desde el LaunchAgent.

    
respondido por el Martin 01.03.2015 - 00:44

Lea otras preguntas en las etiquetas