修复MacOS上crontab的Operation not permitted问题
Contents
因为项目需要Xcode,但是Xcode又必须要在10.15
以上的系统下运行,不得已更新了系统,然而更新一时爽,bug修复***。真的是出现了各种问题,没办法,挨个解决叭…
#起因
为了方便电脑自动化整理文档,我的电脑上一直运行着一堆定时的脚本,用来隔一段时间将截图整理到图片
文件夹。有人这里可能会问,为什么不直接把截图目录设置成Pictures
目录,因为截图在桌面用起来更方便诶,毕竟截图就是为了发出去或者做什么的不是。
但用完所有截图都在桌面真的好乱。
所以我之前版本的定时脚本都是:
1 | $ crontab -l |
在更新系统之前一直都可以正常运行,但更新了之后
1 | You have new mail. |
这个的原因就是苹果更新了System Integrity Protection
功能,具体的可以去看官方的公告:About System Integrity Protection on your Mac,所以最简单粗暴的解决方案就是关闭SIP
。
但我觉得,苹果既然出于安全考虑推出了这样一个功能,那就尽量遵从苹果的思路来,毕竟你后面还要更新系统,难道每次都关一次?何况关起来还挺麻烦的。。。也不安全。
同时你会留意到,系统安全隐私
里增加了一项权限划分Full Disk Access
,大概也是出于安全考虑吧。
这是我修复bug之后的截图了,最开始的时候这里面什么都没有。
还有就是,打开Terminal
的时候,会弹出下列信息:
1 | The default interactive shell is now zsh. |
详细可以去官网看:Use zsh as the default shell on your Mac
所以总结来说,定时脚本出错的原因有两点:
- 苹果更改了默认的shell工具
- shell工具的权限不够
- crontab的权限不够(自我猜测,不知道这点是不是影响因素)
#解决
#更改shell
这一点很好操作,首先先将zsh
作为默认的shell工具。
1 | chsh -s /bin/zsh |
然后只需要重启一下Terminal
就可以了。
然后修改一下定时任务。
1 | % crontab -e |
然后我这样又试了一下,还是报错了:
1 | zsh: can't open input file: /Users/onns/Documents/code/bash/clear |
所以还是需要给zsh
权限
#赋予Full Disk Access权限
- 打开
System Preference -> Security & Privacy -> Privacy
。 - 找到
Full Disk Access
。 - 点击左下角的
锁头🔒
解锁更改权限,输入密码。 - 点击添加按钮,在弹出的文件浏览页面按住
cmd+shift+G
,输入/bin
,点击go
来到/bin
目录并选择zsh
,添加。 - 同理在
/usr/sbin/
目录下找到cron
,添加。
成功,完。
#参考文档
- About System Integrity Protection on your Mac
- Use zsh as the default shell on your Mac
- How to Fix Cron Permission Issues in MacOS Catalina & Mojave
- Fixing cron jobs in Mojave
- Crontab can’t execute python script with error: “[Errno 1] Operation not permitted”
- How to Change the Default Shell to Bash on macOS Catalina
- Mac权限问题,operation not permitted