《三分热度》:mac中意外的Operation not permitted

前言

Mac在升级为OS X EI Capitan之后,增加了一个神奇的rootless机制,或者说系统,谷歌娘表示该机制又被称为最后一道防线,但其增加了普通用户在使用过程中的安全性时,有时候也对攻城狮用户带来了一点小麻烦。

Sudo后的operation not permitted

某天,某攻城狮欢欢喜喜的打算给自己新撸的MacBook装个CocoaPods,经过一番周折(梯子的原因,你懂得)装上了gem后,攻城狮熟练的输入了以下命令:

sudo gem install cocoapods

结果输出了一个让人略烦躁的结果

Fetching: cocoapods-core-1.0.1.gem (100%)
Successfully installed cocoapods-core-1.0.1
Fetching: xcodeproj-1.1.0.gem (100%)
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted - /usr/bin/xcodeproj

关键字:Operation not permitted,权限不足。咦,可是明明已经sudo了呀,难道是mac默认的suodo权限仍然有不足?不死心的某攻城狮把心一横,su到了root用户下(mac默认是没有开启root用户的,但显然这不是什么问题)再install了一把——


可惜仍然是涛声依旧:

Operation not permitted - /usr/bin/xcodeproj

这是怎么回事呢?留意输出中说没有写入/usr/bin/xcodeproj目录的权限。
凭什么?我的地盘我还不能做主了?
抱歉,还真不能。。。因为它——

rootless

简单的说,rootless是mac在升级为OS X EI Capitan之后,一个超然的权限管控机制(关键字SIP,有兴趣童鞋可以自己深挖),它锁死了一些敏感的目录,例如/usr/bin/,不让可疑程序(例如无辜躺枪的gem)有可趁之机。


解决方案1:暗度陈仓

很直观的看到上边的说明以后,相信这是最容易想到的解决方案,既然不能写入/usr目录,而且写入这个目录确实会产生一些不可控的风险,那不装到/usr/bin目录就好了

sudo gem install -n /usr/local/bin cocoapods

修改一下目录就好了,其他涉及到相似的问题,也可以酌情这样处理,这也是比较符合官方思路的处理方案。

解决方案2:明修栈道

可惜有时候天不遂人意,某攻城狮正打算撸个新鲜热辣的php7的时候,相同的问题又粗线了Orz
可这次麻烦在于,系统本身在/usr/bin的目录下有个php5,升级以后喜新厌旧的攻城狮不想要这个东东了,这次没办法绕开目录,必须把这个东西干掉!
既然不能暗度陈仓,那就只能明火执仗,呸,明修栈道了。

  • 重启Mac,并在重启的时候按 Command + R,进入维护模式。
  • 选择工具栏中的 “实用工具 - 终端”。
  • 列表内容

    在终端中执行以下命令:

csrutil disable;
  • 重启。

正常进入系统后rootless就不再生效了,赶快做你本来想做但又因为rootless不能做的事情。要注意的是注意这个时候SIP的保护是完全被关闭了的,最好赶快做完不可描述的事情以后重启电脑,同样进入恢复模式的终端,再执行以下命令:

csrutil enable;

就酱,感觉三分钟已经过了Orz。


有兴趣更深入的童鞋可以戳:参考文献


《三分热度》:mac中意外的Operation not permitted_第1张图片

你可能感兴趣的:(Mac)