【问题标题】:Screencapture over cron shown background instead window contentcron 上的屏幕截图显示背景而不是窗口内容
【发布时间】:2020-04-02 00:03:01
【问题描述】:

在 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 引导层次结构中启动屏幕捕获:PID=pid of loginwindow sudo launchctl bsexec $PID screencapture [选项]"
  • 当我尝试这样做时,我得到:sudo launchctl bsexec 162 /usr/sbin/screencapture test.png > could not create image from display 0 -- 有什么想法吗?

标签: macos cron screenshot screen-capture macos-catalina


【解决方案1】:

更新后也遇到了这个问题。花了几个小时学习细节,这里是为什么和如何。归功于big-circle。原问答here

问题是 cron 没有屏幕访问权限。

解决办法

  1. 关闭 SIP(​​系统完整性保护)。

确保您的 SIP 已禁用。检查是否禁用了 SIP。到终端并输入csrutil status。它应该说 SIP 状态:启用/禁用。 要禁用它:

Powerdown Mac,重新启动并按住 cmd+r 直到 OS X Utilities 窗口出现。打开终端类型csrutil disable。再次重启,进入正常的mac os。

  1. 向 TCC 授予写入权限

sudo chmod 664 /Library/Application\ Support/com.apple.TCC

  1. 向 cron 和 screencapture 授予 screencapure 权限

    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) 屏幕截图:

       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. 在这个阶段重新打开 SIP 可能是个好主意。要启用它,请按照步骤 1 操作,而不是 csrutil disable,只需键入 csrutil enable

编辑 @ 2021-12-09T11:58:00+1000:在 Big Sur 的命令中添加,之后根据 Silvan Mühlemann 的评论添加

【讨论】:

  • 对于第 4 步,csrutil clear 可用于重新启用 SIP,而无需在 macOS Sierra 10.12.2 或更高版本上重新启动以恢复。
  • 对于 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。详情请参阅rainforest.engineering/2021-02-09-macos-tcc
【解决方案2】:

您应该允许您的脚本使用“安全和隐私”系统首选项中的“屏幕录制”。

【讨论】:

  • 是的,它作为“终端”添加到“屏幕录制”中(MacOs 检测屏幕捕获并建议添加)。当我手动运行脚本时 - 一切都很好。 cron 启动脚本时的问题。
  • 你找到解决方案了吗?
  • 这是更简单的解决方案,对我来说可以在命令行上运行以下脚本。 (注意:不是 cron)superuser.com/questions/676735/… 谢谢@Cary
  • 我通过操作 TCC.db 尝试了以下解决方案。这导致 TCC 系统损坏。该解决方案完美运行。注意:我必须授予 /sbin/cron(而不是脚本本身)“屏幕录制”权限。 (使用大苏尔)
【解决方案3】:
  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. how to start bash script in launchd
  2. How to add timing
  3. calendar example

【讨论】:

    【解决方案4】:

    你可以尝试把shebang改成#!/bin/sh,或者把screencapture改成exec screencapture

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多