最近, 有用户反应在 OS X 10.11(以下简称 10.11)下安装 fir-cli 报错, 报错的截图如下:
从报错信息上来看,是操作系统权限的问题,可是用户执行命令的时候已经使用了 sudo 了, 为什么还报错呢? 事实上, 这就是 10.11 新增的 Rootless 引起的.
什么是 Rootless 呢?
知乎上有篇 文章 解释的很清楚。简单的来说, Rootless 机制限制了 Root 账户的权限, 使其没有了对系统的完全控制权.
受到权限影响的有以下几点:
- 禁止直接对 /System, /bin, /sbin, /usr 目录的修改(/usr/local 目录除外). 只有通过苹果开发者认证的 app 才有权限对其修改.
- 禁止注入系统进程. 某些需要注入系统进程(finder, messages 等等系统级别的进程)的程序, debugger 无法使用了.
- 禁止加载内核扩展(kexts), 除非它们被苹果开发者正确的签名
这些修改最明显的好处就是: 恶意 app 无法通过用户授权的方式从而获得所有系统权限了.
当然, 它带来的副作用也是巨大的, 一些合法的 app 也无法获得系统权限了. 比如: Homebrew, CocoaPods 以及所有需要在 /usr/bin 目录下有可执行权限的 app.
如何解决合法 app 也报错的问题呢?
-
对于 CocoaPods, fir-cli 等以 Ruby Gem 包形式发布的 app, 有以下三种解决办法:
1. 使用 RVM 安装 Ruby, 再安装 fir-cli (推荐)
# Install RVM: $ \curl -sSL https://get.rvm.io | bash -s stable --ruby $ gem install fir-cli
2. 指定 fir-cli 中 bin 文件的 PATH
$ export PATH=/usr/local/bin:$PATH;sudo gem install -n /usr/local/bin fir-cli
3. 重写 Ruby Gem 的 bindir
$ echo 'gem: --bindir /usr/local/bin' >> ~/.gemrc $ sudo gem install fir-cli
对于 homebrew 安装的某些 app, 需要 app 作者修改其安装路径, 修改为
/usr/local/bin
开机按住Command+R 直接关闭 Rootless(由于 osx 系统的升级, 这种方式不一定能生效)
我个人认为, Rootless 这种做法, 使得 OS X 系统越来越趋于封闭, 越来越像 Windows.
What is the freedom?
Freedom is the power to decide what your computer does, and the only way to have this freedom is to know what your computer is doing. Freedom is a computer that is without secrets, one where everything can be known if you care enough to find out. -- The Linux Command Line
fir.im - Spirit