如何在macOS Catalina中使用launchctl时修复“Operation not permitted”错误

22

我正在设置一个 launchctl 服务器来定期运行一个 Python 文件。所以我编写了一个.plist 文件和 auto.sh 文件,并且它正常工作。但是,当我安装了 macOS Catalina 后,它失败了。我在 auto.sh 中写入了 "ls -l" 命令来检查文件权限,日志显示:

ls: .: Operation not permitted
python3: can't open file 'auto.py': [Errno 1] Operation not permitted 

我该如何修复它?非常感谢。

这是我的代码:

auto.sh:

#!/bin/bash
. ~/.bash_profile
conda activate base
cd /Users/gassy/Documents/
ls -l
python3 auto.py

我将这个.plist文件放置在/Users/gassy/Library/LaunchAgents/com.gassy.fangzhou.plist。
    ...
    <key>Program</key>
    <string>/Users/gassy/auto/launch.sh</string>
    ...
6个回答

36

最终找到解决方法...

这是与Catalina新权限系统相关的问题,/bin/bash需要拥有[完全磁盘访问权限]。

输入图片描述


2
谢谢。这也有所帮助,如何快速将bash添加到列表中:https://apple.stackexchange.com/questions/376474/enabling-bin-bash-on-catalina-invisible-to-system-preferences-security-p - R.L. Brown
这是我的问题,但我还忘记在我的.sh脚本中添加shebang,所以默认情况下它在“sh”而不是“bash”中运行。 因此,请记住你的shebang应该是这样的:#!/bin/bash - davidfrancis
我在最近的macOS版本中找不到这个设置.... - a06e

4

遵循最小权限原则的精神:

如果您不想给bash完全磁盘访问权限,可以创建一个二进制包装器

创建一个C源代码文件launch.c

#include <stdlib.h>
int main(void) {
  int status = system("/path/to/launch.sh");
  int ret = WEXITSTATUS(status);
  return ret;
}

然后将其编译为launch

gcc -Wall -o launch launch.c

授予完全磁盘访问,并将其添加到launchd属性列表文件中。


1
此外,第一次通过launchctl服务器运行它(例如launchctl start com.test.app),您应该自动收到一个系统偏好设置通知,询问“launch想要访问您的文档文件夹。允许吗?”这样可以避免您手动导航到系统偏好设置,并将磁盘访问限制在您想要的文件夹中。 - gchen

1
我认为你遇到的问题不是Python,而是auto.py文件或路径上的文件权限。运行脚本使用了哪个用户帐户?该用户是否对这两个可执行文件和父目录具有必要的权限?我怀疑目录权限是原因,因为ls命令和auto.py命令都失败了。
如果您将所有内容移出/Users/gassy/Documents并移到另一个位置,例如/opt或/var等,然后确保权限正常,可能会有所帮助。我知道macos将一些在/Users/下的目录特殊处理,有时不太有帮助...

只是补充一下:我不会尝试调整/Users/gassy/Documents的权限,因为我曾经尝试修改那些“特殊”的macOS目录,但并没有什么好结果。最好将其保持原样,并将您的脚本移动到不会惹恼macOS的其他地方... - Z4-tier
感谢你的帮助~ 我尝试将auto.sh移动到\opt并通过launchctl start com.gassy.fangzhoulaunchctl中运行它。然而,它引发了与之前相同的错误。 - Lucas
@Lucas,你也把auto.sh中的cd /Users/gassy/Documents 改成了 cd /opt 了吗? - Z4-tier
我把 auto.py 放在 /Users/gassy/Documents 的另一个文件夹中,现在我将其移动到 /opt,它可以正常工作!我检查了根目录,并发现 /Users/gassy/Documents 的权限为 drwx------@。看起来Macos Catalina更改了 /Users/<user>/Documents 的权限。非常感谢您的帮助! - Lucas

0

在运行 python3 auto.py 前,通过在 bash 脚本中使用 chmod 命令来更改文件的权限。

chmod +x auto.py 应该可以,但我建议您阅读更多相关信息,并具体考虑您的用例。


这是我最初建议的,但我认为问题比仅仅是 auto.py 更大。请注意,ls 命令在那个目录上也失败了。 - Z4-tier

0
@mingxin的解决方案的修改对我有用:基本上是相同的步骤,但是在“安全与隐私”中不是给予完整的磁盘访问权限,而是给予python3完整的访问权限(在我的Big Sur macOS系统中位于/usr/bin)。

0
给你的shell(/bin/sh或/bin/bash)授予“完全磁盘访问权限”可能有效,但这是一个手动过程,无法脚本化/自动化(例如,在创建CI系统时非常基础)。我认为互联网上的人们都被这个问题分心了。
更好的解决方案是将需要被守护程序/代理访问/运行的文件移动到不是~/Documents、~/Desktop等位置的位置。例如,~/bin就可以很好地工作。

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