Zezwolić aplikacji na sterowanie komputerem (urządzeniami pomocniczymi) na Mavericks przez terminal?

10

Obecnie pracuję nad automatyczną instalacją Mavericks 10.9. Mam skonfigurowany NetBoot. Wszystko działa OK, dopóki nie chcę uruchomić Applescript. Od czasu wydania nowej wersji muszę ręcznie włączyć te skrypty. Czy istnieje polecenie, którego można użyć w skrypcie powłoki, aby dodać aplikację do listy urządzeń pomocniczych? A może jest jakiś edytor, który należy edytować, aby działał?

Karol Berliński
źródło
Nie jestem do końca pewien, czy właśnie to widzisz, ale ten artykuł może pomóc: support.apple.com/kb/HT5914
Jay Thompson
Dziękuję za odpowiedź. Natknąłem się również na ten artykuł, gdy szukałem rozwiązania. Nie tego szukam, ponieważ to rozwiązanie nadal korzysta z interakcji GUI.
Karol Berliński
@KarolBerlinski Jakiego obejścia użyłeś? Wciąż próbuję wymyślić, jak dodać aplikację do urządzeń pomocniczych za pomocą wiersza polecenia lub metody innej niż GUI. Dzięki Abraham
AbsterT

Odpowiedzi:

12

Ustawienia są przechowywane w /Library/Application Support/com.apple.TCC/TCC.db:

$ sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'select * from access'
kTCCServiceAccessibility|com.apple.ScriptEditor2|0|1|0|��

kTCCServiceAccessibility|com.red-sweater.FastScripts|0|1|0|��

kTCCServiceAccessibility|com.apple.AccessibilityInspector|0|1|0|��

kTCCServiceAccessibility|com.slate.Slate|0|1|0|��

kTCCServiceAccessibility|com.apple.Automator|0|1|1|
kTCCServiceAccessibility|com.googlecode.iterm2|0|1|1|

Podany schemat sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access'to:

CREATE TABLE access (service TEXT NOT NULL, client TEXT NOT NULL, client_type INTEGER NOT NULL, allowed INTEGER NOT NULL, prompt_count INTEGER NOT NULL, csreq BLOB, CONSTRAINT key PRIMARY KEY (service, client, client_type));

Na mojej instalacji ostatnie cztery kolumny ( client_type, allowed, prompt_count, i csreq) są 0|1|0|\xfa\xde\x0cdo zastosowań, które zostały dodane po "example.app" would like to control this computer using accessibility featuresdialogowe został pokazany i 0|1|1|dla aplikacji, które dodałem, upuszczając je do listy w oknie Preferencje systemowe.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist zawiera listę aplikacji, dla których pokazano ostrzeżenie:

$ defaults read com.apple.universalaccessAuthWarning
{
    "/Applications/Automator.app" = 1;
    "/Applications/Automator.app/Contents/MacOS/Automator" = 1;
    "/Applications/FastScripts.app" = 1;
    "/Applications/FastScripts.app/Contents/MacOS/FastScripts" = 1;
    "/Applications/Slate.app" = 1;
    "/Applications/Slate.app/Contents/MacOS/Slate" = 1;
    "/Applications/Utilities/AppleScript Editor.app" = 1;
    "/Applications/Utilities/AppleScript Editor.app/Contents/MacOS/AppleScript Editor" = 1;
    "/Applications/Xcode.app/Contents/Applications/Accessibility Inspector.app" = 1;
    "/Applications/Xcode.app/Contents/Applications/Accessibility Inspector.app/Contents/MacOS/Accessibility Inspector" = 1;
    "/Applications/iTerm.app" = 1;
    "/Applications/iTerm.app/Contents/MacOS/iTerm" = 1;
    "/Users/lauri/Desktop/aa.app" = 1;
    "/Users/lauri/Desktop/aa.app/Contents/MacOS/applet" = 1;
    "com.apple.AccessibilityInspector" = 1;
    "com.apple.Automator" = 1;
    "com.apple.ScriptEditor.id.aa" = 1;
    "com.apple.ScriptEditor2" = 1;
    "com.red-sweater.FastScripts" = 1;
    "com.slate.Slate" = 1;
}    

Nie mogłem jednak wymyślić, jak faktycznie zezwolić na dostęp do urządzeń pomocniczych dla aplikacji. Próbowałem na przykład uruchomić następujące polecenia:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db 'insert into access values ("kTCCServiceAccessibility","com.apple.ScriptEditor.id.qq",0,1,0,"'$'\xfa\xde\x0c''");'
defaults write com.apple.universalaccessAuthWarning com.apple.ScriptEditor.id.qq -bool true
defaults write com.apple.universalaccessAuthWarning /Users/lauri/Desktop/qq.app -bool true
defaults write com.apple.universalaccessAuthWarning /Users/lauri/Desktop/qq.app/Contents/MacOS/applet -bool true
sudo killall tccd

Próbowałem również uruchomić ponownie, aby zastosować zmiany i ustawić ostatnie cztery kolumny na 0,1,1,"".

Lri
źródło
2
Dziękuję bardzo za twoją opinię. Dzięki temu mogłem dokonać obejścia. Proces tccd nie może zostać zabity, wystarczy zrestartować tutaj. Uruchamiam aplikację, która wymaga Ułatwienia dostępu, a następnie używam sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'aktualizacja dostępu do zestawu dozwolona = 1', a następnie ponownie uruchom system. To działa. Jeszcze raz dziękuję (jeśli potrzebujesz dostępu do jednej aplikacji z listy, możesz dodać klauzulę WHERE do swojej sql).
Karol Berliński
+1 za świetne śpiący. Zobacz odpowiedź AbsterT dla działającego programu opartego na sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistnie bierze udziału w przyznawaniu uprawnień, rejestruje tylko, czy ostrzeżenie zostało wyświetlone, aby uniknąć irytujących użytkowników powtarzającymi się ostrzeżeniami.
mklement0
2
Wartość ??( \xfa\xde\x0c) pochodzi z csreqkolumny zawierającej odcisk palca określonej aplikacji; OSX zarządza tym automatycznie za kulisami - nie trzeba go nigdy określać. Rzeczywista wartość jest znacznie dłuższa; obcięcie do 3 bajtów pochodzi z próby wyprowadzenia wartości binarnej (typu danych BLOB) tak, jakby był łańcuchem, powodując zatrzymanie wyjścia na pierwszym bajcie NUL ( ?rdzeń z \xfai \xdenie jest prawidłowymi znakami w kodowaniu UTF8, \x0cjest pionowy zakładka, która skutecznie tworzy podział linii).
mklement0
csreqKolumna zawiera skompilowane wyznaczone wymagania dla aplikacji, zobacz goo.gl/z10vl i TN2206 Apple podpisywania kodu w głąb przewodnika. Wyznaczone wymagania są zasadniczo skryptem, który sprawdza tożsamość aplikacji poprzez sprawdzenie identyfikatora pakietu i certyfikatów.
zoul
1
Ta technika wydaje się być używana przez Dropbox do dodawania uprawnień do ułatwień dostępu bez udziału użytkownika: applehelpwriter.com/2016/08/08/29/…
pkamb
8

Możesz także dodać plik, wykonując poniższe polecenia.

To polecenie znajdzie identyfikator pakietu dla aplikacji, którą próbujesz dodać do urządzeń pomocniczych.

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/enterapplicaitonnamehere.app/Contents/Info.plist

Załóżmy, że aplikacja, którą próbujesz dodać, to SKYPE. Następnie wprowadź to poniżej:

/usr/libexec/PlistBuddy -c 'Print CFBundleIdentifier' /Applications/Skype.app/Contents/Info.plist

Twój identyfikator pakietu to:

com.skype.skype

Następnie użyj tego wyniku w poniższym poleceniu:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','',0,1,1,NULL);" 

W przypadku Skype wyglądałoby to tak:

sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "REPLACE INTO access VALUES('kTCCServiceAccessibility','com.skype.skype',0,1,1,NULL);" 

Aby usunąć aplikację, użyj sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"

AbsterT
źródło
+1, ale ze względu na niezawodność lepiej jest użyć REPLACE INTOzamiast INSERT INTO, aby upewnić się, że polecenie działa, nawet jeśli baza danych ma już wpis dla określonej aplikacji.
mklement0
@mklement Czy to dodałoby aplikację, gdyby aplikacja jeszcze nie istniała w bazie danych?
AbsterT
Tak, byłoby ( REPLACE INTOto alias dla bardziej opisowego INSERT OR REPLACE INTO).
mklement0
1
REPLACE INTO działa idealnie i lepiej niż INSERT INTO.
AbsterT
Czy ta metoda działa dla wykonywalnych plików binarnych znajdujących się w pakiecie .prefpane?
jasonologia