当10.11的/usr/bin目录不可写之后,class-dump应该何处安家?

许多升级了OSX 10.11的朋友在配置class-dump的时候,会发现书上推荐的class-dump存放目录/usr/bin不再可写,如下所示:

192:~ snakeninny$ touch class-dump /usr/bin
touch: /usr/bin: Operation not permitted
192:~ snakeninny$ sudo touch class-dump /usr/bin
Password:
touch: /usr/bin: Operation not permitted

粗大事了!我们该肿么办!如果按照此帖所说,把class-dump放到/usr/local/bin下,虽然每次执行class-dump都不需要输入全路径(即不用输入/usr/local/bin/class-dump),但此目录下的可执行文件要求执行者是super user,所以每次class-dump都需要输入sudo class-dump,比较麻烦,而且有安全隐患。我们的口号一贯是既要方便,又要安全,那么面对这种情况,我们该怎么办呢?跟我一起来操作吧~

  1. 打开Terminal,输入mkdir ~/bin,在当前用户根目录下创建一个bin目录;
  2. 把class-dump给拷贝到这个目录里,并赋予其可执行权限:mv /path/to/class-dump ~/bin; chmod +x ~/bin/class-dump
  3. 打开~/.bash_profile文件:vi ~/.bash_profile,在文件最上方加一行:export PATH=$HOME/bin/:$PATH,然后保存并退出(在英文输入法中依次按下esc和:(shift + ;,即冒号),然后输入wq,回车即可);
  4. 在Terminal中执行source ~/.bash_profile
  5. 上面的操作把~/bin路径给加入了环境变量,我们测试一下好不好用:
192:~ snakeninny$ pwd class-dump
/Users/snakeninny
192:~ snakeninny$ class-dump
class-dump 3.5 (64 bit)
Usage: class-dump [options] <mach-o-file>

  where options are:
        -a             show instance variable offsets
        -A             show implementation addresses
        --arch <arch>  choose a specific architecture from a universal binary (ppc, ppc64, i386, x86_64, armv6, armv7, armv7s, arm64)
        -C <regex>     only display classes matching regular expression
        -f <str>       find string in method name
        -H             generate header files in current directory, or directory specified with -o
        -I             sort classes, categories, and protocols by inheritance (overrides -s)
        -o <dir>       output directory used for -H
        -r             recursively expand frameworks and fixed VM shared libraries
        -s             sort classes and categories by name
        -S             sort methods by name
        -t             suppress header in output, for testing
        --list-arches  list the arches in the file, then exit
        --sdk-ios      specify iOS SDK version (will look in /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS<version>.sdk
        --sdk-mac      specify Mac OS X version (will look in /Developer/SDKs/MacOSX<version>.sdk
        --sdk-root     specify the full SDK root path (or use --sdk-ios/--sdk-mac for a shortcut)

完美 :relaxed:

6 个赞

这是10.11的一个新特性Rootless也叫System Integrity Protection(SIP)和SELinux差不多,都是限制root用户的权限,其实可以在RecoveryMode关闭这个特性,这样就直接可以读写/usr/bin了,不过不建议。(关闭方法:开机的时候按住option出现选择磁盘的界面按command + R进入RecoveryMode,选择实用工具终端,输入csrutil disable回车搞定)

3 个赞

这个方法是有安全风险的,没有必要,不过我才知道原来这就是Rootless的具体行为之一。学习了!

  1. 第二步中执行 mv /path/to/class-dump ~/bin;需要sudo 才可以。
  2. 在:/Users/hi 路径下执行 vi ~/.bash_profile 提示新建文件,并非教程中的修改文件。
    问题2中是我执行的路径不对么?

你执行这些命令当前的身份是什么?
修改自己目录下的bin目录,没有道理要求root权限啊?
vi ~/.bash_profile本身就已经指定了路径,没有问题,可能你的机器里确实没有这个文件而已

为了看起来home目录舒服一点,我选择酱紫:
mkdir ~/.bin
export PATH=$HOME/.bin/:$PATH

1 个赞

/usr/bin 没有权限你可以放到/usr/local/bin

这个方法在macOS 10.12中不可实现,我也不知道那里有问题。
Last login: Fri Sep 23 12:48:17 on ttys000
WeideMBP:~ swift$ mkdir ~/bin
mkdir: /Users/swift/bin: File exists
WeideMBP:~ swift$ mv /path/to/class-dump ~/bin; chmod +x ~/bin/class-dump;
mv: /path/to/class-dump: No such file or directory
chmod: /Users/swift/bin/class-dump;: No such file or directory
WeideMBP:~ swift$


原因这里已经说的很清楚了吧

192我在输入class-dump的时候返回-bash: class-dump: command not found,没有class-dump这个命令

1 个赞

这本书的作者在哪?连class-dump怎么都放不进去,打开终端默认不是在根目录,必须要先进入根目录,然后又提示,没有该文件,MacdeMacBook-Air:~ luocheng$ cd /
MacdeMacBook-Air:/ luocheng$ ls
Applications dev
DamagedFiles etc
Install OS X El Capitan.app home
Library installer.failurerequests
Network lost+found
System net
Users private
Volumes sbin
bin tmp
com.apple.adc.documentation.docset usr
cores var
MacdeMacBook-Air:/ luocheng$ mv /path/to/class-dump ~/bin
mv: rename /path/to/class-dump to /Users/macmini/bin/class-dump: No such file or directory

找到原因了,本文的path/to/class-dump作为路径,并非path为路径

mv: rename /Volumes/class-dump-3.5/class-dump to /Users/yonyou/bin/class-dump: Read-only file system

按住command+R,进入recovery模式。终端:csrutil disable

一个冒号为一条命令

我也出现这个问题,一头雾水,请问到底是什么原因了?

惭愧,找到原因了,mv /path/to/class-dump path是我自己电脑上bin文件夹的路径

为了避免后续各种工具安装的时候出现Operation not permitted,索性把SIP关了:sweat_smile:

这是有啥问题

完全正常啊