允许应用程序通过终端控制小牛上的计算机(辅助设备)吗?


10

我目前正在从事Mavericks 10.9的自动安装。我已经设置了NetBoot。一切正常,直到我要执行Applescript。自从发布新版本以来,我需要手动启用这些脚本。我可以在外壳程序脚本中使用命令将应用程序添加到“辅助设备”列表中吗?也许有些plist必须进行编辑才能起作用?


我不完全确定这是您所看到的,但是本文可能会有所帮助:support.apple.com/kb/HT5914
Jay Thompson

感谢您的答复。在寻找解决方案时,我也偶然发现了这篇文章。这不是我想要的,因为此解决方案仍使用GUI交互。
KarolBerlinski 2013年

@KarolBerlinski您使用了什么解决方法?我仍在尝试找出如何通过命令行或非GUI方法将应用添加到辅助设备的方法。谢谢亚伯拉罕
AbsterT

Answers:


12

设置存储在/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_typeallowedprompt_countcsreq)是0|1|0|\xfa\xde\x0c对已添加的应用程序后,"example.app" would like to control this computer using accessibility features结果显示对话框,并0|1|1|为应用程序,我将它们拖放到系统偏好设置添加到列表中。

~/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 allowed = 1',然后重新启动系统。有用。再次感谢(如果您需要从列表中访问一个应用程序,则可以在SQL中添加WHERE子句)。
KarolBerlinski

+1可极大地侦查。有关基于的有效编程,请参见AbsterT的答案sudo sqlite3 ...~/Library/Preferences/com.apple.universalaccessAuthWarning.plist并不涉及授予权限,它仅记录是否显示了警告,以避免使用户受到重复警告的困扰。
mklement0 2014年

2
??\xfa\xde\x0c)值从茎csreq柱,其含有对指定的应用程序中的指纹; OSX在后台自动进行管理-无需指定它。实际值要长得多;截断为3个字节的原因是试图将二进制值(数据类型BLOB)当作字符串来输出,导致输出在第一个NUL字节处停止(以UTF8编码?\xfa\xde不是有效字符为源,\x0c是垂直的)标签有效地创建了一个换行符)。
mklement0 2014年

csreq列包含应用程序的已编译指定要求,请参阅goo.gl/z10vl和Apple的TN2206 深度签名代码指南。指定的要求本质上是一个脚本,该脚本通过检查分发包ID和证书来验证应用程序的身份。
zoul 2015年

1
Dropbox似乎使用了这种技术来添加可访问性权利,而无需用户参与:applehelpwriter.com/2016/08/29/…–
pkamb

8

您也可以按照以下命令添加文件。

此命令将找到您要添加到辅助设备的应用程序的捆绑包标识符。

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

对于Skype,它看起来像这样:

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 2014年

@mklement如果数据库中不存在该应用程序,是否会添加该应用程序?
AbsterT

是的,它会(REPLACE INTO是更具描述性的别名INSERT OR REPLACE INTO)。
mklement0 2014年

1
REPLACE INTO的功能比INSERT INTO完美且更好。
AbsterT 2014年

此方法对.prefpane捆绑包内的可执行二进制文件有效吗?
jasonology
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.