出现 operation not permitted (操作没权限),优先想到的就是不是可执行文件,或当前用户没权限,
果断执行 :
chmod 777 file1
但发现加了权限之后仍然出现同样的问题
重点来了:
简单了解下 com.apple.quarantine 与 codesign 覆盖签名
对于一些安装不了的 macOS app,经常使用这两招:
xattr -r -d com.apple.quarantine file1 #主要是为了跳过公证检查
codesign --sign - --force --deep file1 #重新签名
查资料,一般会说删除 com.apple.quarantine 属性是为了绕过公证。
而覆盖签名,解释大概是这样的:如果用一大带宽服务器个横杠作为身份标识,那么特殊的(一种专门的,临时的)签名会生效,这种签名其实是根本不使用身份标识,而是完全识别一个代码实例。
我看有些 macOS 软件(特别是破解的),有时候用 xattr 删除 com.apple.quarantine 属性后还是无法运行,但是用 codesign 重签名后,就可以。
我想问一下做 macOS app 开发的童鞋,这两句具体有什么不同呀?特别是为什么有些软件删除那个属性后不行,但重签名后却可以运行,如果说删除那个属性是为了绕过公证,那重签名又是什么呢?感觉签名这个才是绕过公证呀,有点不太明白。
当下载的文件有 com.apple.quarantine 属性时,就会触发 GateKeeper 和 Notarization 等检查;换句话说如果文件没有这个 flag 的话,系统就不会做如上检查。
总结
1 不好使就来2,2不好使就来3,3不好使估计只能 关闭SPI了
1,chmod 777 file1
2, xattr -r -d com.apple.quarantine file1 # 递归删除file1文件的com.apple.quarantine属性
3, codesign --sign - --force --deep file1
关闭SPI
系统启用了SIP(System Integerity Protection)导致root用户也没有修改权限,所以我们需要屏蔽掉这个功能.
(1)进入恢复模式:关机状态下,长按电源键直至进入选项界面
(2)关闭SPI:进入终端,输入csrutil disable
(3)重启进入正常模式,进入终端,输入csrutil status ,检查状态确保关闭成功,显示以下即可;
System Integrity Protection status: disabled.
注:修改完成后,要恢复SPI:进入终端,输入csrutil enable。