Assistive Access quando lo script viene avviato dall'agente

4

Problema

Applescript eseguito da osascript non è consentito Assistive Access quando viene lanciato dall'agente ( ~/Library/LaunchAgents ). Anche se funziona quando viene eseguito direttamente da editor o riga di comando di Applescript (usando osascript).

Situazione

Il applescript esegue diverse attività GUI per la stampa in batch ed è eseguito due volte al giorno. Pertanto è necessaria l'autorizzazione per accedere a Dispositivi ausiliari e viene avviato da un agente.

Lo script viene eseguito come previsto all'avvio da:

  • Editor di Applescript
  • commandline osascript (non sudo)

Quando viene avviato dall'agente, restituisce:

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

(Messaggio tradotto dall'olandese da me.)

Questo mi ha portato a credere che il problema sia con osascript, ma come ho detto sopra, funziona bene quando inserito direttamente da linea di comando usando: osascript /location/of/my.scpt .

Inoltre, basato su questi due post ho modificato il /Library/Application\ Support/com.apple.TCC/TCC.db Database SQLite e quando controllo la tabella 'access' mostra:

$ 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|

Come puoi vedere, l'accesso di osascript è consentito e ho anche aggiunto il .plist del mio agente per una buona misura.

Possibile causa?

L'unica cosa che posso pensare è che, per qualche motivo, lo script è gestito da un "utente diverso" quando viene lanciato da un agente e quindi sono consentiti diversi dispositivi di assistenza? Sembra improbabile, tuttavia, poiché il TCC.db non sembra specifico dell'utente e l'agente si trova in ~/Library/LaunchAgents .

Aiuto, chiunque?

    
posta Martin 28.02.2015 - 11:33
fonte

2 risposte

3

Una semplice soluzione è salvare invece lo script come file di testo.

Nella parte superiore dello script aggiungi osascript shebang

#!/usr/bin/osascript

Esempio:

#!/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

Nella finestra di salvataggio, scegli Testo come formato file. Il file verrà salvato come testo normale ma con l'estensione .applescript .

Nel terminale, rendere eseguibile il file di testo dello script di salvataggio.

Ho usato:

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

Negli argomenti del comando di LaunchAgent è sufficiente aggiungere il percorso al file.

Non aggiungere il comando osascript agli argomenti. Non ne hai bisogno.

Il file di testo dello script salvato si comporta come uno script di shell eseguibile.

Quando carichi o esegui i LaunchAgent per la prima volta ti verrà chiesto di impostare l'accesso assistito nelle Preferenze di Sistema. Se hai già aperto le preferenze di Sistema, non lo farai, ma il file di testo Script verrà aggiunto all'elenco.

Ora devi solo spuntare la sua casella di controllo per permetterlo.

Ricaricherei LaunchAgent in modo che riprenda subito.

Ho controllato due volte con lo script sopra e tutto funziona come previsto.

    
risposta data 28.02.2015 - 13:13
fonte
2

Mentre ho accettato la domanda di @ markhunte perché funziona nel caso generale, non ha funzionato per me. Questo è il motivo per cui pubblico la mia soluzione come alternativa.

Crea uno shell script che avvia il applescript

Facendo girare il file guncScript che chiama semplicemente al applescript (.scpt), lo shellscript deve essere autorizzato ad accedere ai dispositivi di assistenza una sola volta e può essere eseguito dai launchagent per chiamare a sua volta il applescript.

Nel mio caso, ho finito con il seguente 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>

Questo LaunchAgent chiamerà shellscript.sh due volte al giorno come specificato dalla chiave StartCalendarInterval . Nota anche le chiavi StandardErrorPath e StandardOutPath che erano utili durante il debug.

Il file shellscript.sh è estremamente semplice:

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

Come puoi vedere, una semplice linea di shebang per specificare che si tratta in effetti di uno script di shell seguito da una singola chiamata al applescript che avevo originariamente chiamato direttamente da LaunchAgent.

    
risposta data 01.03.2015 - 00:44
fonte

Leggi altre domande sui tag