Cho phép ứng dụng điều khiển máy tính (thiết bị trợ giúp) trên Mavericks qua Terminal?


10

Tôi hiện đang làm việc trên hệ thống tự động của Mavericks 10.9. Tôi đã thiết lập NetBoot. Mọi thứ đều hoạt động tốt cho đến khi tôi muốn thực thi Applescript. Kể từ khi phát hành phiên bản mới, tôi cần kích hoạt thủ công các tập lệnh đó. Có lệnh nào tôi có thể sử dụng trong shell script để thêm ứng dụng vào danh sách Thiết bị hỗ trợ không? Hoặc có thể có một số plist phải được chỉnh sửa để nó hoạt động?


Tôi không hoàn toàn chắc chắn đây là những gì bạn đang thấy, nhưng bài viết này có thể giúp ích: support.apple.com/kb/HT5914
Jay Thompson

Cảm ơn bạn đã trả lời. Tôi cũng vấp phải bài viết này trong khi tôi đang tìm kiếm giải pháp. Nó không phải là những gì tôi đang tìm kiếm vì giải pháp này vẫn sử dụng tương tác GUI.
KarolBerlinski

@KarolBerlinski Cách giải quyết bạn đã sử dụng là gì? Tôi vẫn đang cố gắng tìm ra cách thêm một ứng dụng vào Thiết bị hỗ trợ thông qua dòng lệnh hoặc phương thức GUI. Cảm ơn Áp-ra-ham
AbsterT

Câu trả lời:


12

Các cài đặt được lưu trữ trong /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|

Lược đồ, như được đưa ra bởi sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db '.schema access', là:

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

Ngày cài đặt của tôi bốn cột cuối cùng ( client_type, allowed, prompt_count, và csreq) là 0|1|0|\xfa\xde\x0ccho các ứng dụng đã được thêm vào sau khi "example.app" would like to control this computer using accessibility featureshộp thoại được hiển thị và 0|1|1|cho các ứng dụng mà tôi thêm vào bằng cách thả chúng vào danh sách trong System Preferences.

~/Library/Preferences/com.apple.universalaccessAuthWarning.plist chứa danh sách các ứng dụng mà hộp thoại cảnh báo đã được hiển thị:

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

Tôi không thể tìm ra cách thực sự cho phép truy cập các thiết bị trợ giúp cho một ứng dụng. Tôi đã thử ví dụ chạy các lệnh này:

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

Tôi cũng đã thử khởi động lại để áp dụng các thay đổi và đặt bốn cột cuối cùng thành 0,1,1,"".


2
Cảm ơn rất nhiều vì phản hồi của bạn. Tôi đã có thể làm cho một cách giải quyết nhờ nó. Việc xử lý tccd không thể bị giết, chỉ khởi động lại là đủ ở đây. Tôi khởi động ứng dụng cần Quyền truy cập, sau đó sử dụng sudo sqlite3 / Library / Application \ Support / com.apple.TCC / TCC.db 'bộ truy cập cập nhật được phép = 1' và sau đó khởi động lại hệ thống. Nó hoạt động. Cảm ơn một lần nữa (Nếu bạn cần truy cập cho một ứng dụng từ danh sách, bạn có thể thêm mệnh đề WHERE vào sql của bạn).
KarolBerlinski

+1 cho sự điều tra tuyệt vời. Xem câu trả lời của AbsterT cho một chương trình làm việc dựa trên sudo sqlite3 .... ~/Library/Preferences/com.apple.universalaccessAuthWarning.plistkhông liên quan đến việc cấp quyền, nó chỉ ghi lại xem cảnh báo đã được hiển thị để tránh người dùng khó chịu với các cảnh báo lặp đi lặp lại hay chưa.
mkuity0

2
Các ??( \xfa\xde\x0cgiá trị) bắt nguồn từ csreqcột, trong đó có một dấu vân tay của các loại ứng dụng theo quy định; OSX quản lý tự động đằng sau hậu trường - không cần phải chỉ định nó. Giá trị thực tế dài hơn nhiều; việc cắt thành 3 byte xuất phát từ việc cố gắng xuất giá trị nhị phân (kiểu dữ liệu BLOB) như thể đó là một chuỗi, khiến đầu ra dừng ở byte NUL đầu tiên ( ?gốc từ \xfa\xdekhông phải là ký tự hợp lệ trong mã hóa UTF8, \x0clà một dọc tab có hiệu quả tạo ra một ngắt dòng).
mkuity0

Các csreqcột chứa các yêu cầu biên soạn dành riêng cho các ứng dụng, xem goo.gl/z10vl và TN2206 của Apple Ký Mã trong Depth dẫn. Các yêu cầu được chỉ định về cơ bản là một tập lệnh xác thực danh tính của ứng dụng bằng cách kiểm tra ID gói và chứng chỉ.
zoul

1
Kỹ thuật này dường như được Dropbox sử dụng để thêm các quyền truy cập mà không cần sự tham gia của người dùng: applehelpwriter.com/2016/08/29/ gợi
pkamb

8

Bạn cũng có thể thêm tệp bằng cách làm theo các lệnh dưới đây.

Lệnh này sẽ tìm Mã nhận dạng gói cho ứng dụng bạn đang cố gắng thêm vào Thiết bị hỗ trợ.

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

Giả sử ứng dụng bạn đang cố thêm là SKYPE. Sau đó, bạn sẽ nhập này dưới đây:

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

Và định danh gói của bạn sẽ là:

com.skype.skype

Sau đó, bạn sử dụng đầu ra này trong lệnh dưới đây:

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

Đối với Skype, nó sẽ trông như thế này:

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

Để xóa ứng dụng, bạn sẽ sử dụng sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "delete from access where client='com.skype.skype';"


+1, nhưng để mạnh mẽ, tốt hơn là sử dụng REPLACE INTOthay INSERT INTOvì để đảm bảo lệnh hoạt động ngay cả khi cơ sở dữ liệu đã có mục nhập cho ứng dụng đã chỉ định.
mkuity0

@mkuity Sẽ thêm ứng dụng nếu ứng dụng chưa tồn tại trong cơ sở dữ liệu?
AbsterT

Vâng, nó sẽ ( REPLACE INTOlà một bí danh cho mô tả nhiều hơn INSERT OR REPLACE INTO).
mkuity0

1
REPLACE INTO đang hoạt động hoàn hảo và tốt hơn so với INSERT INTO.
AbsterT

Phương thức này có hiệu quả đối với các nhị phân thực thi nằm trong Gói .prefpane không?
jasonology
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.