如何让Mac上launchd运行的脚本获得摄像头授权?
问题:Launchd调用摄像头脚本失败,无需终端的解决方案
问题背景
编写了一个调用摄像头拍照的脚本,希望Mac解锁时自动运行,因此在~/Library/LaunchAgents/目录下创建了com.example.selfie.plist文件。脚本在终端中运行正常,plist也能执行写入文本操作,但无法通过plist执行imagesnap命令。
相关文件内容
selfie.sh 脚本
#!/bin/bash datetime=$(date "%Y%m%d_%H%M%S") imagesnap -q -w 2 "/Users/taccle/Documents/Projets/Selfie/Photos/${datetime}.jpg"
com.example.selfie.plist 文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.example.selfie</string> <key>ProgramArguments</key> <array> <string>/Users/taccle/Documents/Projets/Selfie/selfie.sh</string> </array> <key>WatchPaths</key> <array> <string>/Library/Preferences/com.apple.biometrickitd.plist</string> </array> </dict> </plist>
临时解决方案
目前找到的临时办法是让plist调用中间脚本run_in_command_line.sh,通过终端运行拍照脚本,内容如下:
#!/bin/bash osascript -e 'tell application "Terminal" do script "/Users/taccle/Documents/Projets/Selfie/selfie.sh; exit" end tell'
该方案可正常运行,但希望摆脱终端依赖,仅用单个脚本实现。
核心疑问与解答
疑问
能否直接为launchd授予摄像头访问权限?如何查看launchd脚本的运行日志?
解答
关于launchd的摄像头权限
macOS隐私权限仅针对应用程序,而非launchd这类后台进程,因此无法直接给launchd添加摄像头权限。后台进程的权限继承自父进程,launchd作为系统级进程,默认没有摄像头访问权限。无需终端的可行方案
可以通过osascript在用户图形会话上下文执行脚本,继承用户已授权的权限(前提是终端已获得过摄像头权限),有两种实现方式:- 修改plist直接调用osascript
更新com.example.selfie.plist的ProgramArguments部分:<key>ProgramArguments</key> <array> <string>/usr/bin/osascript</string> <string>-e</string> <string>do shell script "/Users/taccle/Documents/Projets/Selfie/selfie.sh"</string> </array> - 修改selfie.sh加入osascript包装
调整脚本内容,让imagesnap在用户会话中执行:#!/bin/bash datetime=$(date "%Y%m%d_%H%M%S") osascript -e "do shell script \"imagesnap -q -w 2 '/Users/taccle/Documents/Projets/Selfie/Photos/${datetime}.jpg'\""
- 修改plist直接调用osascript
查看launchd运行日志
使用log命令检索相关日志:
# 查看目标plist的相关日志 log show --predicate 'process == "launchd" AND sender CONTAINS "com.example.selfie"' --info --last 1h # 搜索与imagesnap相关的日志 log show --predicate 'eventMessage CONTAINS "imagesnap"' --info --last 1h
内容的提问来源于stack exchange,提问作者taccle
相关产品推荐
相关产品推荐

