关于macos:如何修复自制权限?

How to fix homebrew permissions?

我已经卸载并安装了三次Homebrew,因为它似乎从不允许我安装任何东西,因为它在大多数安装结束时拒绝我的权限。

作为一个例子,我将发布我目前面临的libjpeg下载场景。

我尝试安装libjpeg并获得:

1
2
3
4
5
6
7
8
9
$ brew install libjpeg
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/jpeg-8d.mountain_lion.bottle.1.tar.gz
Already downloaded: /Library/Caches/Homebrew/jpeg-8d.mountain_lion.bottle.1.tar.gz
==> Pouring jpeg-8d.mountain_lion.bottle.1.tar.gz
Warning: Could not link jpeg. Unlinking...
Error: The brew link step did not complete successfully
The formula built, but is not symlinked into /usr/local
You can try again using `brew link jpeg'
Error: Permission denied - /usr/local/opt/jpeg

"brew link jpeg"结果出现在

1
Error: Permission denied - /usr/local/opt/jpeg

这是我的酿酒医生读到的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ brew doctor
Warning:"config" scripts exist outside your system or Homebrew directories.
./configure scripts often look for *-config scripts to determine if
software packages are installed, and what additional flags to use when
compiling and linking.

Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew provided
script of the same name. We found the following"config" scripts:

/Library/Frameworks/Python.framework/Versions/2.7/bin/python-config
/Library/Frameworks/Python.framework/Versions/2.7/bin/python2-config
/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
Warning: You have unlinked kegs in your Cellar
Leaving kegs unlinked can lead to build-trouble and cause brews that depend on
those kegs to fail to run properly once built. Run brew link on these:

jpeg

这个许可问题使得任何东西都无法使用BREW,我非常感谢您的建议。


我通过在文件夹上使用chown解决了这个问题:

1
sudo chown -R"$USER":admin /usr/local

同样,你(很可能)也必须在/Library/Caches/Homebrew上做同样的事情:

1
sudo chown -R"$USER":admin /Library/Caches/Homebrew

显然我以前用过sudo,改变了我对/usr/local的文件夹许可,从现在开始,所有使用BREW的安装都被证明是成功的。

这个答案来自Github的自制问题跟踪程序。


针对Macos High Sierra用户的新命令,因为在/usr/local上无法执行chown

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

参考:https://github.com/homebrew/brew/issues/3228


对于像我一样来到这里的任何人来说,第一个选择就是遵循这一建议:

1
brew doctor

这是最安全的道路,除此之外,它还建议我:

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

解决了权限问题。

手术室就是这样做的,但显然没有得到上面的建议;你可以,而且最好从那里开始,如果没有帮助的话,只有在那之后寻找非琐碎的解决方案。


如果您在OSX High Sierra上,/usr/local不能再是chownD。您可以使用:

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


我有这个问题……一个有效的解决方案是改变/usr/local的所有权。通过以下方式发送给当前用户而不是root

1
  sudo chown -R $(whoami):admin /usr/local

但实际上这不是一个合适的方法。主要是如果您的机器是服务器或多个用户。

我的建议是按照上述方式更改所有权,并使用BREW执行任何操作。(更新,安装…etc)然后将所有权重置回根目录,如下所示:

1
  sudo chown -R root:admin /usr/local

这将解决问题,并保持所有权设置在适当的集合中。


最高投票人的命令对我不起作用。

它得到了输出:

chown: /usr/{my_username}dmin: illegal user name

此命令工作正常(组/usr/local已经是admin):

1
sudo chown -R $USER /usr/local


我没有/user/local/Frameworks文件夹,所以这帮我把它修好了。

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

第一行创建一个新的框架文件夹供自制使用。第二行为该文件夹提供了您当前的用户权限,这就足够了。

我有OSX高塞拉


如果您希望使用比覆盖chown -R稍微更具针对性的方法,您可能会发现此fix-homebrew脚本非常有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/sh

[ -e `which brew` ] || {
    echo Homebrew doesn\'t appear to be installed.
    exit -1
}

BREW_ROOT="`dirname $(dirname $(which brew))`"
BREW_GROUP=admin
BREW_DIRS=".git bin sbin Library Cellar share etc lib opt CONTRIBUTING.md README.md SUPPORTERS.md"

echo"This script will recursively update the group on the following paths"
echo"to the '${BREW_GROUP}' group and make them group writable:"
echo""

for dir in $BREW_DIRS ; do {
    [ -e"$BREW_ROOT/$dir" ] && echo"    $BREW_ROOT/$dir"
} ; done

echo""
echo"It will also stash (and clean) any changes that are currently in the homebrew repo, so that you have a fresh blank-slate."
echo""

read -p 'Press any key to continue or CTRL-C to abort.'

echo"You may be asked below for your login password."
echo""

# Non-recursively update the root brew path.
echo Updating"$BREW_ROOT" . . .
sudo chgrp"$BREW_GROUP""$BREW_ROOT"
sudo chmod g+w"$BREW_ROOT"

# Recursively update the other paths.
for dir in $BREW_DIRS ; do {
    [ -e"$BREW_ROOT/$dir" ] && (
        echo Recursively updating"$BREW_ROOT/$dir" . . .
        sudo chmod -R g+w"$BREW_ROOT/$dir"
        sudo chgrp -R"$BREW_GROUP""$BREW_ROOT/$dir"
    )
} ; done

# Non-distructively move any git crud out of the way
echo Stashing changes in"$BREW_ROOT" . . .
cd $BREW_ROOT
git add .
git stash
git clean -d -f Library

echo Finished.

它不向用户执行chmod操作,而是向admin组(您可能属于该组)提供对自制/usr/local中特定目录的写访问权。它还准确地告诉你在做之前它打算做什么。


我还不想乱弄文件夹权限,所以我做了以下操作:

brew doctorbrew upgradebrew cleanup

然后我就可以继续成功地安装我的另一个BREW公式了。


在我的例子中,/usr/local/frameworks甚至不存在,所以我做到了:

1
2
sudo mkdir /usr/local/Frameworks
sudo chown -R $(whoami) /usr/local/Frameworks

然后一切都按预期工作。


这解决了我面前的问题。

1
2
sudo chown -R"$USER":admin /Users/$USER/Library/Caches/Homebrew
sudo chown -R"$USER":admin /usr/local


我通过以下命令解决了我的问题:

1
2
3
4
sudo mkdir /usr/local/Cellar
sudo mkdir /usr/local/opt
sudo chown -R $(whoami) /usr/local/Cellar
sudo chown -R $(whoami) /usr/local/opt


所有这些建议都可能有效。在最新版本的BREW Doctor中,我们提出了更好的建议。

首先,通过在命令行中运行该命令,修复您可能已经用/usr/local造成的混乱:

sudo chown -R root:wheel /usr/local

然后取得该用户专用路径的所有权:

1
sudo chown -R $(whoami) /usr/local/lib /usr/local/sbin /usr/local/var /usr/local/Frameworks /usr/local/lib/pkgconfig /usr/local/share/locale

如果您运行sudo brew update,然后阅读您将遇到的所有警告和错误,那么所有这些信息都是可用的。


对于多用户Mac,这对我很有用:

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


Github上有一个杀手级脚本,可以修复/usr/local和brew目录上的perms,任何"admin"组成员都可以访问这些目录。

https://gist.github.com/jaibee/9a4ea6aa9d428bc77925

这是一个比所选答案更好的解决方案,因为如果您将/usr/local/uuuuu目录转换为$user,那么您将破坏该计算机上的任何其他自制管理用户。

以下是我发布这篇文章时脚本的要点:

1
2
3
4
5
6
7
8
chgrp -R admin /usr/local
chmod -R g+w /usr/local

chgrp -R admin /Library/Caches/Homebrew
chmod -R g+w /Library/Caches/Homebrew

chgrp -R admin /opt/homebrew-cask
chmod -R g+w /opt/homebrew-cask

对我来说,它在

brew doctor

更改权限命令导致另一个错误

chown: /usr/local: Operation not permitted


1
cd /usr/local && sudo chown -R $(whoami) bin etc include lib sbin share var opt Cellar Frameworks

在我的例子中,我在移除和重新安装saltstack时遇到了问题。

运行后:

1
ls -lah /usr/local/Cellar/salt/

我注意到小组的负责人是"员工"。(顺便说一句,我运行的是MacOS Mojave版本10.14.3。)员工组可能与我的工作场所配置有关,但我不太清楚。不管怎样,我保留了这个团队,以防止自己进一步破坏任何东西。

然后我跑了:

1
sudo chown -R"$USER":staff /usr/local/Cellar/salt/

在那之后,我成功地用这个命令(而不是根目录)删除了它:

1
brew uninstall --force salt

实际上很简单,执行以下命令:brew doctor

它将告诉您要做什么,修复权限问题,例如在我的案例中:

这就是问题所在:

1
2
3
Warning: The following directories are not writable by your user:
/usr/local/share/man/man5
/usr/local/share/man/man7

这就是解决方案:

1
2
You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/share/man/man5 /usr/local/share/man/man7


如果您没有最新的自制程序:我在过去"修复"了这个问题,强制homebrew作为根目录运行,这只能通过将homebrew可执行文件的所有权更改为根目录来完成。在某种程度上,他们删除了这个功能。

我知道他们会给出很多警告,说它不应该作为根目录运行,但是,别这样,它不能正常工作。


我尝试了这一页上的所有内容,最终使用了这个解决方案:

brew uninstall --force brew-cask; brew untap $tap_name; brew update; brew cleanup; brew cask cleanup;

我的情况与OP类似,但是我的问题是由使用BREW桶运行sudo,然后得到错误的密码引起的。在这之后,我被限制了权限,无法进行安装。


解决运行文件夹时BREW权限的错误

1
brew prune

这将解决问题,我们不必更改任何目录。


尝试同时执行此命令

sudo chmod+t/tmp