如何在MacOS High Sierra上修复Homebrew的权限

83

我尝试使用Homebrew安装Python,它下载了Python,但最后弹出一个错误消息导致安装未能完成。当我再次尝试安装时,提示我执行以下操作:

$ brew link python

输入之后,仍然出现相同的错误信息:

permission denied @ dir_s_mkdir - /usr/local/lib

我尝试过:

$ sudo chown -R $(whoami) /usr/local

我收到了这样一条错误信息:

chown: /usr/local: 操作不允许


如果你出于某些原因不想输入用户名,则可以使用反引号:\whomai``。 - henrikstroem
4
一般来说,这更适合在 [unix.se] 或 [apple.se] 发布,因为它并不直接涉及到“编写软件的过程”,而这是本站所关注的话题。 - Charles Duffy
“/usr/local/” 目录下是否有任何 ACL 参数、文件标志或扩展属性?使用 ls -le 命令检查 ACL,使用 ls -lO 命令检查标志,使用 ls -l@ 命令检查 xattrs。 - bnaecker
请查看此处的brew fix: https://gist.github.com/irazasyed/7732946 - Zlemini
@CharlesDuffy 这是这个问题的适当位置。请参阅 https://stackoverflow.com/help/on-topic 指南中指出,SO适用于与“程序员常用的软件工具”相关的问题,而在本地开发环境中安装Python绝对是一个编程任务。 - Martin Joiner
@MartinJoine,但是这个问题与Python无关。这个问题适用于UNIX上的任何软件,而不仅仅是Python解释器(或其他软件开发工具)。我们不支持有人询问如何修理他们的CRT,因为他们想使用计算机编写程序;同样地,如果一个通用的UNIX问题同样适用于非编程相关的目的,我们也不支持。请参见您链接到的同一页中的短语“与软件开发相关的唯一问题”。 - Charles Duffy
14个回答

151
sudo mkdir /usr/local/Frameworks
sudo chown $(whoami):admin /usr/local/Frameworks    
brew link python3

它对我起作用了。我不知道这些命令中有什么魔力,但它救了我的命。感谢@Chris Krycho。 - Shiva Krishna Chippa
1
@ShivakrishnaChippa 上述魔法创建了:1)/usr/local/Frameworks目录;2)将该目录的所有权更改为当前用户;最后3)brew link会在Cellar中创建手动安装的软件包的符号链接。有关brew link的更多信息,请参见此处https://dev59.com/vVwX5IYBdhLWcg3w4SzR - Sylvester Loreto
它对我有用。但是,如果我输入python -V,它仍然会给我2.7.10。 - Kishor kumar R
1
这对macOS Mojave也适用。但是在执行brew link python3的安装之前,我选择执行brew uninstall python,然后再执行brew install python - ndrone
工作了,但还需要brew reinstall python - Scott Willeke
对我来说很有效(至少可以消除brew doctor警告),而无需重新安装Python。 - Florag

21
sudo mkdir /usr/local/Frameworks

sudo chown $USER /usr/local/Frameworks

然后尝试重新安装Python。这对我来说非常有效。


15

运行此程序,并按照其建议操作:

brew doctor

在我的情况下,它让我运行:

sudo mkdir -p /usr/local/sbin /usr/local/Frameworks
sudo chown -R $(whoami) /usr/local/sbin /usr/local/Frameworks

这对我有用。brew doctor 推荐了相同的命令。 - Dávid Molnár

10

我尝试过,得到了同样的输出(我认为是这样的):

Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks

我创建了一个名为/usr/local/Frameworks的目录,并使用root账户更改了所有权:

所以我创建了一个名为/usr/local/Frameworks的目录,作为root用户,并更改了其所有权:

sudo mkdir /usr/local/Frameworks && chown $USER:admin /usr/local/Frameworks

我又尝试了一次brew install python

Warning: python 2.7.14 is already installed, it's just not linked.
You can use `brew link python` to link this version.

然后执行brew link python

Linking /usr/local/Cellar/python/2.7.14... 26 symlinks created

现在在目录 /usr/local/Frameworks/Python.framework/ 我可以看到链接,例如:

lrwxr-xr-x 1 niquit admin  62 Dec  8 21:41 /usr/local/Frameworks/Python.framework/Headers -> ../../Cellar/python/2.7.14/Frameworks/Python.framework/Headers/
lrwxr-xr-x 1 niquit admin  61 Dec  8 21:41 /usr/local/Frameworks/Python.framework/Python -> ../../Cellar/python/2.7.14/Frameworks/Python.framework/Python*
lrwxr-xr-x 1 niquit admin  64 Dec  8 21:41 /usr/local/Frameworks/Python.framework/Resources -> ../../Cellar/python/2.7.14/Frameworks/Python.framework/Resources/
在您的情况下,我建议手动创建/usr/local/lib:
sudo mkdir /usr/local/lib && chown $USER:admin /usr/local/lib

我通过mv /usr/local/lib{,.orig}进行了测试,结果如下:

Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/lib
Error: Permission denied @ dir_s_mkdir - /usr/local/lib

就像之前我手动创建了目录 sudo mkdir /usr/local/lib && chown $USER:admin /usr/local/lib,并成功运行了 brew link python

Linking /usr/local/Cellar/python/2.7.14... 324 symlinks created

现在我可以找到一些链接:

lrwxr-xr-x 1 niquit admin  54 Dec  8 22:01 python-2.7.pc -> ../../Cellar/python/2.7.14/lib/pkgconfig/python-2.7.pc
lrwxr-xr-x 1 niquit admin  50 Dec  8 22:01 python.pc -> ../../Cellar/python/2.7.14/lib/pkgconfig/python.pc
lrwxr-xr-x 1 niquit admin  51 Dec  8 22:01 python2.pc -> ../../Cellar/python/2.7.14/lib/pkgconfig/python2.pc

我认为在最新的更新后,苹果增强了安全性,因此现在无法在没有管理员权限的情况下创建 /usr/ 目录。


实际上比那更糟。你无法修改 /usr/local/ 目录,除非先禁用系统完整性保护,因为该目录的权限高于 root 用户。 - Walrus the Cat
@WalrustheCat /usr/local/在SIP保护的文件中是特别不包括的。请参阅此文 - bnaecker
我的是什么?我在互联网上看到了相同的结果,它们说的是同样的事情? - Walrus the Cat
@WalrustheCat,当你运行ls -lO /usr时,你的/usr/local目录旁边列出了restricted?这听起来像是一个问题,绝对不应该这样设置。我看过的所有官方Apple文档(以及大量非官方文档)都明确地将/usr/local从SIP中排除。我想知道它是怎么变成那样的。 - bnaecker

8
在我的情况下,我在一台新机器上进行了MacOS 10.14的全新安装:
brew doctor

它的意思是:
sudo mkdir -p /usr/local/lib /usr/local/sbin
sudo chown -R $(whoami) /usr/local/lib /usr/local/sbin

6

/usr/local 在 High Sierra 中不再能够使用 chown 命令进行更改。请使用以下命令代替:

sudo chown -R $(whoami) $(brew --prefix)/*

6

针对 macOS 用户的命令:

bash/zsh:

sudo chown -R $(whoami) $(brew --prefix)/*

fish:

sudo chown -R (whoami) (brew --prefix)/*


4

我重新安装了Brew并解决了问题。

要卸载,请使用以下命令。

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"

并重新安装brew。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

4

卸载并进行Homebrew的全新安装可以解决该问题。


我不太清楚这个怎么可能会起作用。Homebrew 只会尝试重新安装到 /usr/local/,如果权限已经出了问题,那么它的行为方式与当前安装尝试创建符号链接有什么不同呢?我猜你可以强制 Homebrew 使用不同的 brew --prefix - bnaecker
如果你在保护/usr/local的情况下,如你在其他评论中提到的那样,那么这是怎么工作的?你又是如何删除之前安装的Homebrew的? - bnaecker
1
brew.sh 的 brew install 脚本会处理一些 brew doctor 目前还不知道如何处理的事情。 - Simon B.

3
brew doctor

如评论区Chris所建议的,这个命令几乎解决了我在一台非官方运行macOS Mojave的Mac Mini 2011 5,1上遇到的所有home-brew问题。只需输入该命令并按照终端打印的所有方向操作即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接