屏幕截图使用cron显示背景而非窗口内容

10

在macOs Catalina上使用cron制作截屏存在问题。当手动运行do_screenshot.sh脚本时,一切正常。但是当它自动在cron上运行时,会出现问题,只有菜单是正确的,窗口内容显示为macOs背景(见图片)。

do_screenshot.sh

#!/bin/bash

DATEFULL=`date '+%Y%m%d%H%M%S'`
FILENAME="/Users/yak/Documents/screenshots/"$DATEFULL.png
/usr/sbin/screencapture -x $FILENAME

在此输入图片描述


man screencapture 表示:“安全注意事项 要在通过ssh登录时捕获屏幕内容,您必须在与loginwindow相同的mach引导层次结构中启动screencapture:PID = loginwindow的pid sudo launchctl bsexec $ PID screencapture [选项]” - TheNextman
2
当我尝试这样做时,出现以下错误:sudo launchctl bsexec 162 /usr/sbin/screencapture test.png > could not create image from display 0 -- 有什么想法吗? - Roman Gaufman
5个回答

9
在更新后我遇到了这个问题。花了数小时学习细节,以下是原因和解决方法,感谢big-circle。原问题和答案在此处
问题是cron没有屏幕访问权限。
以下是解决方案:
  1. 关闭SIP(系统完整性保护)。
确保SIP已禁用。要检查SIP是否已禁用,请转到终端并键入csrutil status。它应该显示SIP状态:已启用/已禁用。 要禁用它:
关机Mac,重新启动并按住cmd+r,直到出现OS X实用程序窗口。打开终端键入csrutil disable。再次重启,启动到正常的mac os。
  1. 授予TCC写入权限
sudo chmod 664 /Library/Application\ Support/com.apple.TCC
  1. grant screencapure privilege to cron and screencapture

    a) CRON:

       `sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'insert into access values ("kTCCServiceScreenCapture", "/usr/sbin/cron", 1, 1, 1, "", "", "", "UNUSED", "", 0,"")'`
    

    b) screencapture:

       Pre Big Sur:
    `sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'insert into access values ("kTCCServiceScreenCapture", "/usr/sbin/screencapture", 1, 1, 1, "", "", "", "UNUSED", "", 0,"")'`
    

    --------------------------------------------------------------------------

       Big Sur and later:
    `sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'insert into access values ("kTCCServiceScreenCapture", "/usr/sbin/screencapture", 1,2,4,1, "", "", "", "UNUSED", "", 0,"")'`
    
  2. It's probably a good idea to turn SIP back on at this stage. To enable it, follow step 1, and instead of csrutil disable just type csrutil enable.

编辑 @ 2021-12-09T11:58:00+1000:根据Silvan Mühlemann的评论,添加了针对Big Sur和更高版本的命令。


对于第四步,可以使用csrutil clear来重新启用SIP,而无需在macOS Sierra 10.12.2或更高版本中重新启动到恢复模式。 - Matias
对于Big Sur及更高版本,命令有些变化。以下命令适用于我: sudo sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" 'insert into access values ("kTCCServiceScreenCapture", "/usr/sbin/screencapture", 1,2,4,1, "", "", "", "UNUSED", "", 0,"")' 请注意序列1,2,4,1。有关更多详细信息,请参见https://rainforest.engineering/2021-02-09-macos-tcc/。 - Silvan Mühlemann

2

您应该允许您的脚本在“安全性与隐私”系统偏好设置中使用“屏幕录制”功能。


是的,它被添加到“屏幕录制”中作为“终端”(MacOS检测屏幕捕获并提出添加)。 当我手动运行脚本时 - 一切正常。当脚本由cron启动时可能会出现问题。 - Aleksandr Yakushev
你有没有找到解决办法? - Roman Gaufman
这是更简单的解决方案,适用于我在命令行上运行以下脚本。(注意:不是cron)https://superuser.com/questions/676735/taking-screen-shot-from-mac-by-an-interval 谢谢@Cary - watsonic
1
我尝试了下面的解决方案,通过操作TCC.db文件。结果导致TCC系统崩溃。这个解决方案完美地解决了问题。注意:我不得不授予/sbin/cron(而不是脚本本身)“屏幕录制”权限。(使用Big Sur) - Silvan Mühlemann
只需给 /usr/sbin/cron 添加“屏幕录制”即可。 - aisensiy

1
  1. 你可以通过在终端中使用长循环来在后台启动应用程序(需要手动启动,这不太好):
#!/bin/bash
for value in {1..980}
do
/Users/<username>/record_activity_with_screen_capture.bash
sleep 60
done
echo All done

或者

使用launchd(而不是cron)运行此脚本。 有两个示例:

  1. 如何在launchd中启动bash脚本
  2. 如何添加定时
  3. 日历示例

1

不要玩弄危险的SIP(系统完整性保护),尽管顶部答案建议这样做,但只需将屏幕录制权限授予/usr/sbin/cron(或某些MacOS版本中的/sbin/cron)。

为了实现这一点:

  1. 打开系统设置
  2. 打开安全与隐私
  3. 进入隐私选项卡
  4. 进入屏幕录制
  5. 点击左下角的锁并进行身份验证,以启用编辑列表
  6. 现在,如果 cron 在列表中且未选中,请选中它,任务就完成了。如果根本没有列出来,您需要手动添加它
  7. 单击程序列表下方的“+”
  8. 在文件选择器中按下 Cmd+Shift+G 的魔法命令,这将显示一个“转到文件夹”弹出窗口
  9. 输入:/usr/sbin 并按 Enter 键(如果您在接下来的步骤中找不到 cron,请尝试在此处使用 /sbin
  10. 您应该会看到一个文件列表,所有文件都带有黑色终端的图标
  11. 在列表中找到 cron 并点击“打开”
  12. 选中 cron 旁边的复选框
  13. 等待 cron 再次运行命令。

完成,现在应该可以捕获屏幕截图了。


-2

你可以尝试将shebang更改为#!/bin/sh,或将screencapture更改为exec screencapture


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接