OSX mojave:“crontab:tmp/tmp.X:操作不允许”

OSX mojave:“crontab:tmp/tmp.X:操作不允许”

将我的 OSX 更新到 Mojave 后,似乎我无法再编辑我的 crontab。任何尝试这样做都会导致此问题标题上的错误消息。

我跟踪了 crontab/private/var/at并且权限与另一台运行 El Capitan 的计算机相同:

/private/var/at$ ls -laO
total 0
drwxr-xr-x   8 daemon  wheel  -           256B Feb 18 16:47 ./
drwxr-xr-x  26 root    wheel  sunlnk      832B Feb 18 16:51 ../
-rw-r--r--   1 root    wheel  -             0B Aug 22 22:11 at.deny
-rw-r--r--   1 root    wheel  compressed    6B Aug 17  2018 cron.deny
drwxr-xr-x   2 daemon  wheel  -            64B Aug 17  2018 jobs/
drwxr-xr-x   2 daemon  wheel  -            64B Aug 22 22:11 spool/
drwx------   4 root    wheel  -           128B Nov 22 12:46 tabs/
drwx------   2 root    wheel  -            64B Feb 18 15:04 tmp/

/private/var$ ls -laOd at
drwxr-xr-x  8 daemon  wheel  -  256B Feb 18 16:47 at/

/private$ ls -laOd var
drwxr-xr-x  26 root  wheel  sunlnk  832B Feb 18 16:51 var/

与那台计算机不同,我尝试在下面执行的任何 sudo 更改/private/var/at(例如sudo touch test)都会收到“操作不允许”的提示。在/private/var及以上,我能够 sudo 更改任何内容(就像我在 中测试的有限且明显的更改类型一样/private/var/at,而不是任何事物)。

有些东西阻止我更改内容/private/var/at,我认为这就是导致 crontab 错误消息的原因,因为crontab无法写入/private/var/at/tmp和创建错误消息中报告的 tmp crontab 文件。

我知道 crontab 不是 OSX 中的首选方法,但这不是这个问题的重点。

答案1

短的回答:

转到系统偏好设置>安全和隐私,并授予终端完全磁盘访问权限。

长的回答:

  1. 拉下 Apple 菜单并选择“系统偏好设置”
  2. 选择“安全和隐私”控制面板
  3. 现在选择“隐私”选项卡,然后从左侧菜单中选择“完全磁盘访问”
  4. 单击偏好设置面板左下角的锁定图标,然后使用管理员级别登录进行身份验证
  5. 现在单击 [+] 加号按钮添加具有完全磁盘访问权限的应用程序
  6. 导航到 /Applications/Utilities/ 文件夹并选择“终端”以授予终端完全磁盘访问权限
  7. 重新启动终端,“操作不允许”错误消息将消失

答案2

我不得不cron补充系统偏好设置 > 安全和隐私 > 完全磁盘访问

  1. 查找隐私偏好:CMD + 空格, “私人”

  1. 解锁偏好设置完全磁盘访问并打开选择菜单

  1. 选择菜单CMD + Shift + 。取消隐藏文件并导航到/usr/sbin/cron。(您可以cron通过$ which cron在终端中运行来检查可执行文件的位置)

]

答案3

另一种不需要任何权限更改的方法是通过 ssh 对 localhost 执行 crontab 更新(前提是在共享系统首选项中启用了远程登录/ssh),这取决于sshd已经启用了“完全磁盘访问”(或者可以按照 @Soid 所述启用)的事实,例如:

ssh localhost
crontab -e

答案4

沙盒阻止您编写 crontab。如果您运行 crontab 命令…

  • 使用本地机器上的终端:系统偏好设置>安全和隐私,并授予终端完全磁盘访问权限
  • 使用第三方终端应用程序:系统偏好设置>安全和隐私,并授予第三方终端应用程序完全磁盘访问权限
  • 通过另一台机器的 ssh:它应该可以工作(参见@Pierz 的回答)
  • screen命令:要么退出screen,要么使用@Pierz 的答案。

相关内容