3

【原创】通过命令修改MacOS的安全性与隐私权限

 1 year ago
source link: https://feiju12138.github.io/2022/09/24/%E9%80%9A%E8%BF%87%E5%91%BD%E4%BB%A4%E4%BF%AE%E6%94%B9MacOS%E7%9A%84%E5%AE%89%E5%85%A8%E6%80%A7%E4%B8%8E%E9%9A%90%E7%A7%81%E6%9D%83%E9%99%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

最近在学习Python办公自动化,利用到了xlwings模块,这个模块可以通过Python代码操作Microsoft Excl,但是很奇怪,在Windows上可以正常执行,但是在MacOS上却不能正常执行,报错:MESSAGE: The user has declined permission.

第一次探索

  • 和很多普通用户一样,我直接去搜索引擎将我的报错粘贴上去,通过搜索前辈的踩坑经验,我发现原因是IDEA没有权限

尝试解决问题

  • 为了能让使用了xlwings模块的Python正常运行,可以采取以下办法
  1. 降级开发者工具或更换

据说低版本的IDEA可以弹出权限申请窗口,更换VSCode也可以解决这个问题,但是我没有尝试,因为我既不想降级,也不想更换开发者工具

  1. 使用终端运行Python代码

经过测试,这个办法真的有用,因为终端可以弹出申请权限的弹窗,给予权限后就能正常运行代码

01.png


02.png

但是这种方法只能解决代码运行的问题,仍然不能用IDEA去运行Python代码,我总不能在IDEA敲代码然后去终端运行吧,这样一点也不geek

  1. 使用终端运行IDEA
/Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea

实际上,这种方法的原理和上一种方法是一样的,就是将IDEA申请控制Excl这件事情变成了终端控制Excl罢了,因为终端能弹出申请权限的弹窗,这样就变相的解决了问题,但是同样的,我总不能每次都用终端启动Excl吧,这样仍然一点都不geek

  • 通过测试,我发现安全性与隐私设置中,自动化设置多了2条关于终端的配置,那么也就是说,只要让IDEA也得到了自动化的权限,那么就可以实现IDEA操作Excl了,然而自动化的权限并不能手动添加,只能通过App去调用,我总不能为了这个不弹出权限申请窗口的BUG修改IDEA源码吧,况且IDEA也不是开源的,那么探索仍要继续

03.png

第二次探索

  • 自己不能解决的问题当然也可以试一试向他人求助,由于我观看的教学视频中,讲师和我使用的都是MacOS系统,并且她也没有出现这个报错,说明讲师已经解决了这个问题,于是我勇敢的向老师提出了这个问题,但是得到的答案是:老师使用的是Pycharm,而我使用的是IDEA,老师没有在Pycharm上出现问题,不如我也更换为Pycharm

总结起来,和第一次探索的第一种方法一样,其实我心里清楚,并不是开发者工具惹的祸,种种迹象表明应该是MacOS权限惹的祸,虽然更换开发者工具或许可以解决问题,但是我还是想继续探索得到我认为最完美的解决方案

第三次探索

  • 既然我始终认为是MacOS系统惹的祸,那么解铃人还需系铃人,我拨打了4006668800苹果客服

如你所想的那样,苹果客服并不是苹果开发工程师,他们的技术水平虽然高于普通用户,但是仅限从苹果官方文档中查找解决方案,所以我并没有得到我想要的解决方案

再次尝试解决问题

  • 通过之前的探索,我得到了以下几个命令
# 重置安全性与隐私中所有权限
tccutil reset AppleEvents

# 查看安全性与隐私中所有权限
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db "SELECT * FROM access"
  • 通过观察,我发现查看安全性与隐私中所有权限的命令,实际上是使用管理员权限调用了sqlite3,sqlite3我自学过,因为是关系型数据库,所以可以使用SQL语句,而/Library/Application\ Support/com.apple.TCC/TCC.db就是数据库文件的路径了。既然这样,那我岂不是可以用SQL语句中的UPDATE语句修改数据库了

我用IDEA的数据库插件连接了sqlite3数据库,操作方法是:只要将/Library/Application\ Support/com.apple.TCC/TCC.db数据库文件拖拽到IDEA中,IDEA就会自动配置,首次使用需要下载sqlite3驱动

04.png
# 查看所有数据,其中包含了关键字`com.apple.Terminal`、`com.jetbrains.intellij`,不难看出这分别就是终端和IDEA相关的权限了
SELECT * FROM access;

# 因为之前我已经在安全性与隐私中得到了终端的权限,所以我尝试获取所有终端的权限
SELECT * FROM access WHERE client="com.apple.Terminal";

# 然后我利用`tccutil reset AppleEvents`清除了所有安全性与隐私权限,此时再次查询所有终端的权限,进行比对
SELECT * FROM access WHERE client="com.apple.Terminal";

# 此时我发现少了2条,刚好是刚刚被清除的2条,得到了自动化设置的字段和值:`service`、`kTCCServiceAppleEvents`
SELECT * FROM access WHERE service="kTCCServiceAppleEvents";

# 尝试利用UPDATE语句修改一下,把终端的自动化权限改为
UPDATE access SET client="com.jetbrains.intellij" WHERE service="kTCCServiceAppleEvents" AND client="com.apple.Terminal";
  • 去系统偏好设置中查看了一下,呀,竟然成功了!

05.png
  • 如果有和我一样的问题:IDEA(或者说是Jetbrains系列的软件,如;Pycharm)无法直接运行有xlwings模块的Python代码,可以先用终端执行一次Python代码,在终端得到了操作Excl的权限后,再通过以下命令将终端修改为IDEA
sudo sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db UPDATE access SET client='com.jetbrains.intellij' WHERE service='kTCCServiceAppleEvents' AND client='com.apple.Terminal'

完成(进阶)

  • 如果想要修改其他不能直接在系统偏好设置中修改的安全性与隐私设置时,可以先尝试添加其他应用程序的权限,然后再将终端改为其他应用程序

终端最好添加,因为是Mac官方的软件,而且由于终端可以执行命令,理论上可以通过命令触发各种权限的申请

完成(升华)

  • 如果想要直接添加不能直接在系统便好设置中修改的安全性与隐私设置时,那么我想说,由于查看数据表的时候,得到了某些字段的值并不为人所知,而且还有的数据是二进制的形式存储的,所以如果想要从无到有添加任意一个权限的话,通过我本文的思路,或许你可以研究出方法,在这里我的问题已经被解决了,不再深入探讨了
  • 遇到了一个问题,在使用SQL语句操作Sqlite数据库时,IDEA提示权限不足,原因是IDEA如果是直接从其动态启动的,那么他会以IDEA的身份启动,而不是用户的身份启动,而安全性与隐私的数据库权限是用户,所以提示权限不足,以下给出解决方法:
  1. 直接使用终端操作Sqlite,因为终端默认是用户的身份
  2. 使用终端打开IDEA,再用IDEA操作Sqlite,因为这样打开的IDEA权限就是用户了
/Applications/IntelliJ\ IDEA.app/Contents/MacOS/idea

博客园——绝世老中医
知乎——木子翎
CSDN——云胡同学
CSDN——CDA曹鑫
stackoverflow
Jetbrains支持
Github——xlwings Issues
简书——lihao_李浩
知乎—— 知乎用户arCS7e


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK