MacOS系统中下载文件、新建项目之后,这些文件权限都会默认是只读状态,这时需要简单的一句权限设置命令就可以解决

 sudo chmod -R 777 /your_path  # 你要修改文件上层目录的路径

 

但是在对 usr/bin 目录下的文件进行操作的时候往往会出现错误提示:operation not permitted

例如:对 Xvfb 创建软链接,提示的错误信息:

$ sudo ln -s /usr/X11/bin/Xvfb /usr/bin/Xvfb
ln: /usr/bin/Xvfb: Operation not permitted

 

上面的问题,是因为一些MacOS用户在升级系统之后,电脑启用了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下依然无法修改文件。

在必要时候,为了能够修改下面的文件,我们只能关闭该保护机制,步骤如下:

1)重启Mac电脑,过程中按住 command+R,进入恢复分区,然后在 "实用工具" 栏找到 "终端启动运行"

2)打开terminal终端,输入  csrutil disable

3)再次重启Mac电脑,即可对 /usr/bin 目录下文件进行修改

例如: sudo ln -s /usr/X11/bin/Xvfb /usr/bin/Xvfb

4)如果要恢复保护机制,重新进入保护模式,输入  csrutil enable

 

另一种解决方案

原文:Really, really add /usr/local/bin to the PATH variable on macOS

具体操作步骤:

This comment on github provides a way to achieve that.

Open a Terminal window and copy & paste the following command:

sudo launchctl config user path /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

$ sudo launchctl config user path /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
Configuration applied. You must reboot for changes to take effect.

Then Reboot Your Computer.

The command will set the default environment and add /usr/local/bin to the PATH variable of the system’s default environment. Hence, the executables under /usr/local/bin are callable from the default configuration.

 

1、创建临时目录

错误提示信息:

File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/pyvirtualdisplay/abstractdisplay.py", line 295, in _wait_for_pipe_text
    raise XStartError(
pyvirtualdisplay.abstractdisplay.XStartError: Xvfb program closed. command: ['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '800x600x24', '-displayfd', '5'] stderr: b'_XSERVTransmkdir: ERROR: euid != 0,
directory /tmp/.X11-unix will not be created.\n_XSERVTransSocketUNIXCreateListener: mkdir(/tmp/.X11-unix) failed, errno = 2\n_XSERVTransMakeAllCOTSServerListeners: failed to create listener for local\n_XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created.\n_XSERVTransSocketUNIXCreateListener: mkdir(/tmp/.X11-unix) failed, errno = 2\n_XSERVTransMakeAllCOTSServerListeners: failed to create listener for local\n_XSERVTransmkdir: ERROR: euid != 0,directory /tmp/.X11-unix will not be created.\n_XSERVTransSocketUNIXCreateListener: mkdir(/tmp/.X11-unix) failed, errno = 

解决办法:

sudo mkdir -p /tmp/.X11-unix

 

2、对临时目录授权

错误提示信息:

line 295, in _wait_for_pipe_text
    raise XStartError(
pyvirtualdisplay.abstractdisplay.XStartError: Xvfb program closed. command: ['Xvfb', '-br', '-nolisten', 'tcp', '-screen', '0', '800x600x24', '-displayfd', '5'] stderr: b'_XSERVTransmkdir: ERROR:
Owner of /tmp/.X11-unix must be set to root\n_XSERVTransSocketUNIXCreateListener: mkdir(/tmp/.X11-unix) failed, errno = 1\n_XSERVTransMakeAllCOTSServerListeners: failed to create listener for local\n_XSERVTransmkdir: ERROR: Owner of /tmp/.X11-unix must be set to root\n_XSERVTransSocketUNIXCreateListener: mkdir(/tmp/.X11-unix) failed, errno = 1\n_XSERVTransMakeAllCOTSServerListeners: failed to create listener for local\n_XSERVTransmkdir: ERROR: Owner of /tmp/.X11-unix must be set to 

查看临时目录权限:

$ ls -al /tmp/
total 48
drwxrwxrwt  15 root   wheel    480 12 17 18:23 .
drwxr-xr-x   6 root   wheel    192  5 20  2020 ..
drwxrwxrwt   2 homer  wheel     64 12 17 18:22 .X11-unix
drwx------   3 homer  wheel     96 12 17 18:16 .vnc-501

由上可见, /tmp/.X11-unix 临时目录的所有者为 homer 不是root

解决办法:

sudo chown root:wheel /tmp/.X11-unix

然后,再次查看 /tmp/.X11-unix 临时目录权限

$ ls -al /tmp/                        
total 48
drwxrwxrwt  15 root   wheel    480 12 17 18:24 .
drwxr-xr-x   6 root   wheel    192  5 20  2020 ..
drwxrwxrwt   2 root   wheel     64 12 17 18:22 .X11-unix
drwx------   3 homer  wheel     96 12 17 18:16 .vnc-501

由上可见, /tmp/.X11-unix 临时目录的所有者为 root ,问题解决!

 

 

知识拓展

Mac OS 更新到X 11后,El Capitan 加入了Rootless机制,用来对抗恶意程序的破坏。

但是,却不能够再随便的读写类似/usr/bin的很多路径,即便设置 root 权限同样不可以。

Rootless 机制是对抗恶意程序的最后防线,除非特殊需要时我们才将其关闭,否则保持开启状态。

 

csrutil 命令参数格式:

csrutil enable [--without kext | fs | debug | dtrace | nvram][--no-internal]

等同于csrutil enable –without kext –without fs –without debug
–without dtrace –without nvram)

B0: [kext] 允许加载不受信任的kext(与已被废除的kext-dev-mode=1等效)
B1: [fs] 解锁文件系统限制
B2: [debug] 允许task_for_pid()调用
B3: [n/a] 允许内核调试 (官方的csrutil工具无法设置此位)
B4: [internal] Apple内部保留位(csrutil默认会设置此位,实际不会起作用。设置与否均可)
B5: [dtrace]解锁dtrace限制
B6: [nvram] 解锁NVRAM限制

csrutil 禁用命令: csrutil disable

csrutil 启用命令: csrutil enable

 

 

参考推荐:

MacBook Pro 系统上添加定时任务的几种方法

苹果电脑 MacBook Pro 连接WIFI 经常断线的解决方法

Linux / MacOS 修改 ls 显示年月日的时间格式

MacBook Pro 修改 mac 地址

如何将 MacOS Catalina 降级为 Mojave

macOS 制作 Catalina 系统的U盘启动安装盘教程

macOS 文件夹加密的图文详解

macOS 文件格式和移动硬盘格式化

MacBookPro 使用 Time Machine 备份系统实践

MacBookPro 使用 Time Machine 时间机器备份系统

Macbook Pro 如何清空/修改最近路径列表 Recent Places 数量