Разрешить приложению управлять компьютером (вспомогательными устройствами) на Mavericks через терминал?


9

В настоящее время я работаю над автоматической установкой Mavericks 10.9. У меня настроен NetBoot. Все работает хорошо, пока я не хочу выполнить Applescript. С момента выхода новой версии мне нужно вручную включить эти скрипты. Есть ли команда, которую я могу использовать в сценарии оболочки, чтобы добавить приложение в список вспомогательных устройств? Или, может быть, есть какой-то лист, который нужно отредактировать, чтобы он работал?


Я не совсем уверен, что это то, что вы видите, но эта статья может помочь: support.apple.com/kb/HT5914
Джей Томпсон,

Спасибо за ответ. Я также наткнулся на эту статью, пока искал решение. Это не то, что я ищу, так как это решение все еще использует взаимодействие с графическим интерфейсом.
KarolBerlinski

@KarolBerlinski Какой обходной путь вы использовали? Я все еще пытаюсь выяснить, как добавить приложение на вспомогательные устройства с помощью командной строки или не с помощью графического метода. Спасибо Аврааму
AbsterT

Ответы:


10

Настройки хранятся в /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|

Схема, как указано в sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access':

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));

На моей установке последние четыре колонок ( client_type, allowed, prompt_countи csreq) являются 0|1|0|\xfa\xde\x0cдля приложений , которые были добавлены после того , как "example.app" would like to control this computer using accessibility featuresдиалог был показан и 0|1|1|для приложений , которые я добавил, опуская их в список в System Preferences.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist содержит список приложений, для которых было показано диалоговое окно предупреждения:

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

Я не мог понять, как на самом деле разрешить доступ для вспомогательных устройств для приложения, хотя. Я попытался, например, запустить эти команды:

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

Я также попытался перезапустить, чтобы применить изменения и установить последние четыре столбца 0,1,1,"".


2
Большое спасибо за ваш отзыв. Я смог сделать обходной путь благодаря этому. Процесс tccd не может быть уничтожен, достаточно будет только перезагрузки. Я запускаю приложение, которому требуется доступ, затем использую sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'update access set разрешено = 1', а затем перезагружаю систему. Оно работает. Еще раз спасибо (если вам нужен доступ для одного приложения из списка, вы можете добавить предложение WHERE в ваш sql).
KarolBerlinski

+1 за отличную работу См . Ответ AbsterT для рабочей программы на основе sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistне участвует в предоставлении разрешений, он только записывает, было ли показано предупреждение, чтобы избежать раздражающих пользователей повторными предупреждениями.
mklement0

2
Значение ??( \xfa\xde\x0c) вытекает из csreqстолбца, который содержит отпечатки пальцев указанного приложения; OSX управляет этим автоматически за кулисами - нет необходимости когда-либо указывать это. Фактическая стоимость намного дольше; усечение до 3 байтов происходит из-за попытки вывести двоичное значение (тип данных BLOB), как если бы оно было строкой, в результате чего вывод останавливается на первом байте NUL ( ?основание \xfaи \xdeнедопустимые символы в кодировке UTF8 \x0cявляются вертикальными вкладка, которая эффективно создает разрыв строки).
mklement0

csreqСтолбец содержит скомпилированные назначенные требования для приложения, см goo.gl/z10vl и TN2206 компании Apple подписывания кода в глубины руководства. Назначенные требования - это, по сути, сценарий, который проверяет подлинность приложения путем проверки идентификатора пакета и сертификатов.
Zoul

1
Похоже, что эта техника используется Dropbox для добавления прав доступа без участия пользователя: applehelpwriter.com/2016/08/29/…
pkamb

6

Вы также можете добавить файл, следуя приведенным ниже командам.

Эта команда найдет идентификатор пакета для приложения, которое вы пытаетесь добавить к вспомогательным устройствам.

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

Допустим, приложение, которое вы пытались добавить, было SKYPE. Затем вы должны ввести это ниже:

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

И ваш идентификатор пакета будет:

com.skype.skype

Затем вы используете этот вывод в команде ниже:

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

Для скайпа это будет выглядеть так:

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

Чтобы удалить приложение, вы должны использовать sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"


+1, но для надежности лучше использовать REPLACE INTOвместо того, INSERT INTOчтобы гарантировать, что команда работает, даже если в базе данных уже есть запись для указанного приложения.
mklement0

@mklement Будет ли это добавить приложение, если приложение еще не существует в базе данных?
AbsterT

Да, было бы ( REPLACE INTOэто псевдоним для более описательной INSERT OR REPLACE INTO).
mklement0

1
REPLACE INTO работает отлично и лучше, чем INSERT INTO.
AbsterT

Работает ли этот метод для исполняемых двоичных файлов, которые находятся внутри .prefpane Bundle?
Джейсонология
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.