“bad interpreter: Operation not permitted” 在El Capitan上的错误

13

我的团队正在编写一个需要调用外部目录中的shell脚本的Mac OS应用程序。

该应用程序在Yosemite(10.10.3)上运行良好。但是,如果我在El Capitan(10.11.2)上运行它,则应用程序会从脚本中收到如下错误:

/bin/bash: <path-to-script>: /bin/sh: bad interpreter: Operation not permitted

我可以在像这样的简单脚本中触发此错误:

#!/bin/sh
echo "Hello World!"

如果我手动从终端运行脚本,则不会出现错误。

应用程序使用文件选择器打开脚本目录。 我确认该应用程序可以读取此目录中的其他文件。

/bin/sh更改为/bin/bash或不同路径上/bin/sh的副本,使用新的解释器路径仍然会出现相同的错误。

一位同事在禁用系统完整性保护的El Capitan机器上测试了此问题,但他得到了相同的错误。

我正在从.pkg文件安装测试应用程序。 权限如下:

<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.files.bookmarks.app-scope</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>

添加com.apple.security.files.user-selected.executable权限并没有改变情况。

如果我尝试运行打包过程中生成的 .app 文件,我能够无错误地运行脚本。

下面的问题描述了一个类似的错误。但是,我检查了应用程序和脚本,发现它们都没有设置 com.apple.quarantine 属性。

Mac OS:/usr/bin/env:bad interpreter:Operation not permitted

https://apple.stackexchange.com/questions/49589/bash-applications-mvim-bin-sh-bad-interpreter-operation-not-permitted

--- 更新 ----

我们在 PKG 权限列表中添加了两个权限:

<key>com.apple.security.scripting-targets</key>
<true/>
<key>com.apple.security.temporary-exception.apple-events</key>
<true/>
我们尝试通过位于应用程序目录的AppleScript (.scpt)文件来运行简单的.sh文件,我们还确认.sh文件和.scpt文件都没有任何扩展属性,但是我们仍然遇到了错误。
以下分别显示了AppleScript和shell脚本文件上的“ls -@Oel”命令。
$ ls -@Oel TestMXMLCall.scpt 
-rwxrwxrwx  1 root  wheel  - 2302 Jun 15 03:12 TestMXMLCall.scpt
$ ls -@Oel /usr/local/bin/mxmlc
-rwxr-xr-x  1 santanukarar  staff  - 2190 Jun 15 01:17 /usr/local/bin/mxmlc

2
这可能与行尾样式有关,也许脚本使用的是dos风格的CR-LF或unix风格的LF而不是仅有CR?这只是一个想法。 - Stefan Hegny
1
如果您明确运行/bin/sh /path/to/script,它会以那个方式运行吗? - anishsane
你用 ls -l /bin/sh 得到什么? - cdarke
@anishsane 如您所述,该命令在手动在终端中运行时很好,但在应用程序内部无法运行。 - Santanu Karar
如果我手动在终端上运行该命令,结果为:-r-xr-xr-x 1 root wheel 632672 Dec 3 2015 /bin/sh。如果您有其他想法,我将计划从我们的应用程序中运行此命令。 - Santanu Karar
“file /path/to/script” 显示的是哪种行结尾? - anishsane
3个回答

26

尝试这个: $ ls -l@ 脚本所在的位置 如果它说它有com.apple.quarantine,那就是问题。从最安全到最危险运行其中之一:

$ xattr -d com.apple.quarantine whereverthescriptis   # delete that attr
$ xattr -c whereverthescriptis    # delete ALL the attrs on file
$ xattr -c *         # on every file in this dir
$ xattr -cr .        # and all subdirectories

3
2020年在macOS Catalina上遇到了这个问题。 - Jon Buys
在2021年的macOS Monterey上工作得很好,谢谢。 - Paul

3
希望这个解决方案能帮到某些人,因为我的解决方法稍微有点特别:我让别人替我编写了代码,所以当我拿到代码时,它在Android和iOS上都显示“操作不允许”的状态而无法运行。
事实证明,我需要进入包含项目的文件夹并拥有该文件夹的所有权。在Mac上,您可以进入包含Flutter项目的文件夹,然后从上下文菜单中单击“获取信息”。然后在最后一个窗格中将访问权限更改为“只读”,然后再更改为“读写”。
接下来,按照上述建议之一继续进行操作,通过打开终端,使用“cd”命令导航到包含Flutter项目的文件夹,并输入以下命令来删除文件夹中的Apple隔离属性:
xattr -dr com.apple.quarantine [your flutter project directory name]

就是这样!现在Android Studio或您选择的IDE将能够从该文件夹运行iOS和Android版本。


我真的很高兴它成功了。祝你好运。 - sbenati

1

如果你使用pods,我可以帮你解决问题:

  1. 执行pod deintegrate命令
  2. 执行pod install命令

然后项目就可以运行了。


你能解释一下什么是 Pod 以及我该如何安装它吗?只是为了避免一些误解。 - Mouse On Mars
我不知道为什么会发生这种情况,但是这个解决方案没有任何问题。 - Sravan

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