【问题标题】:How to Fix Permissions on Home-brew on MacOS High Sierra如何在 MacOS High Sierra 上修复 Home-brew 的权限
【发布时间】:2017-11-27 14:14:49
【问题描述】:

当我尝试将 python 安装到 homebrew 上时,它下载了它,然后在最后弹出一条错误消息,阻止它完成。当我再次尝试这样做时,它会要求我这样做:

$ brew link python

输入后出现同样的错误信息:

权限被拒绝@dir_s_mkdir - /usr/local/lib

我已经尝试过:

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

我收到一条错误消息:

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

【问题讨论】:

  • 如果您出于某种原因不想输入用户名,请使用记号:`whomai`
  • 一般来说,这更适合Unix & LinuxAsk Different,而不是像这里的主题那样直接涉及编写软件的过程
  • /usr/local/ 是否有任何 ACL 参数、文件标志或扩展属性?使用 ls -le 检查 ACL,ls -lO 检查标志,ls -l@ 检查 xattrs。
  • 在此处查看 brew 修复:gist.github.com/irazasyed/7732946
  • @CharlesDuffy 这适合这个问题的地方。请参阅stackoverflow.com/help/on-topic 的指导方针说 SO 是针对与“程序员常用的软件工具”相关的问题,并且在本地开发环境中安装 Python 绝对是一项编程任务。

标签: python bash homebrew


【解决方案1】:
sudo mkdir /usr/local/Frameworks
sudo chown $(whoami):admin /usr/local/Frameworks    
brew link python3

【讨论】:

  • 它对我有用。我不知道命令中有什么魔力,但它救了我的命。谢谢@Chris Krycho
  • @ShivakrishnaChippa 上面的魔法创建:1)/usr/local/Frameworks 目录; 2) 将该目录所有权更改为当前用户,最后 3) brew link 创建指向您在 Cellar 中手动执行的安装的符号链接。有关brew link 的更多信息,请点击此处stackoverflow.com/questions/33268389/what-does-brew-link-do
  • 它对我有用。但是,如果我给 python -V,它仍然给我 2.7.10
  • 为我工作!非常感谢
  • 这也适用于 macos mojave。但是安装brew link python3 我选择做一个brew uninstall python 然后brew install python
【解决方案2】:
sudo mkdir /usr/local/Frameworks

sudo chown $USER /usr/local/Frameworks

然后尝试重新安装 python。这对我来说绝对没问题。

【讨论】:

    【解决方案3】:

    运行它,并遵循它的建议:

    brew doctor
    

    就我而言,它希望我跑:

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

    【讨论】:

    • 这对我有用。 brew doctor 推荐相同的命令。
    【解决方案4】:

    我尝试过并且有相同的(我认为)输出:

    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
    

    所以我以 root 身份创建了一个目录 /usr/local/Frameworks,然后更改了所有权:

    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
    

    A通过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
    

    我认为 Apple 在最新更新后提高了安全性,因此如果没有 root 权限,现在无法在 /usr/ 中创建目录。

    【讨论】:

    • 实际上比这更糟。您不能在不禁用系统完整性保护的情况下修改 /usr/local/。它的权限高于root。
    • @WalrustheCat /usr/local/ 明确包含在受 SIP 保护的文件中。见this
    • 我的是?我在互联网上看到结果说同样的话?
    • @WalrustheCat 你的/usr/local 目录在你运行ls -lO /usr 时在它旁边列出restricted?这听起来像一个 问题,绝对不是它应该设置的方式。我见过的所有苹果官方文档(以及很多非官方的东西)都明确排除 /usr/local 来自 SIP。我想知道它是怎么变成这样的。
    【解决方案5】:

    以我在新机器上全新安装 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 中使用。而是使用

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

      【讨论】:

        【解决方案7】:

        macOS 用户的命令

        bash/zsh:

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

        鱼:

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

        【讨论】:

          【解决方案8】:

          卸载并全新安装 homebrew 将解决此问题。

          【讨论】:

          • 我不太明白这是如何工作的。 Homebrew 只会尝试重新安装到/usr/local/,如果权限已经不正常,那么与当前尝试创建符号链接的安装有何不同?我想你可以强制 Homebrew 使用不同的brew --prefix
          • 如您在其他评论中提到的那样,如果您有 SIP 保护 /usr/local,那它是如何工作的?你是怎么删除以前安装的 Homebrew 的?
          • 也为我工作!
          • brew.sh 中的 brew install 脚本执行 brew doctor (还)不知道要处理的事情。
          【解决方案9】:

          我重新安装了 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)"
          

          【讨论】:

            【解决方案10】:
            brew doctor
            

            这个命令,正如上面 Chris 在 cmets 中所建议的,解决了我在非官方运行 MacOS Mojave 的 Mac Mini 2011 5,1 上运行的几乎所有自制问题。只需输入并按照终端打印的所有指示进行操作

            【讨论】:

              【解决方案11】:

              如 henrikstroem 所述,反引号可能会有所帮助,并且如 bnaecker 所述,特殊属性也可能会阻碍该过程。

              您也可以尝试直接以 root 身份运行该命令以查看是否有更好的结果,方法是先执行sudo su -,然后执行chown -R username /usr/local

              但是你确定这真的是你想要的吗? 创建一个对其具有访问权限的组(例如chown -R originaluser:group /usr/local,设置您想要的权限,和/或让您的用户成为该组的一部分可能会更有趣。

              【讨论】:

              • 我认为sudo commandsudo su -; command 之间没有区别,除了command 运行的结果环境。问题是关于 Homebrew,它肯定需要用户实际拥有 /usr/local/ 才能正常工作。
              • 我猜在单用户系统上它不会那么糟糕
              • 伙计们,你的答案都没有接近这个问题。我知道你甚至没有尝试这里所要求的。
              • @WalrustheCat 我们究竟将如何“尝试”任何事情?我们没有 OP 的问题,我也不打算在我最常用的目录之一上设置一些明显难以禁用的权限。
              • @bnaecker 真相!!
              【解决方案12】:

              macOS 提供了多种方法来控制对文件的访问,而不仅仅是用户、组和其他人的传统权限。这包括访问控制列表 (ACL)、文件标志、扩展属性 (xattrs),以及最近的 Apple 系统完整性保护。

              我敢打赌,如果你运行ls -lO /usr/ 来列出标志,你会在/usr/local 前面看到uchg,它指示系统使文件对任何用户都不可变。 (uchg 中的u 表示文件所有者可以修改此标志。所有者或任何其他用户都不能修改文件本身。)

              要解决此问题,您首先需要通过运行:chflags nouchg /usr/local 来删除该标志。这应该删除uchg 标志,您应该使用ls -lO 再次验证。如果设置了另一个标志,例如schg,则通常使用noschgno<flag>,但当标志以s开头时,您需要sudo这些命令。

              此时,您可能仍需要chown 目录,与sudo chown -R $(whoami) /usr/local。您现在应该拥有该目录,并且 Homebrew 工具应该可以正常工作。

              【讨论】:

                【解决方案13】:

                我刚刚做了这个,它工作正常:

                sudo touch /usr/local/Frameworks
                brew link python
                

                【讨论】:

                • 我有没有说别的?看起来@Chris 的答案更好。为什么不发表有用的评论而不是扔石头?
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-10-06
                • 1970-01-01
                • 2018-06-16
                • 2021-07-16
                • 2018-08-17
                • 1970-01-01
                • 2018-12-05
                相关资源
                最近更新 更多