如何在多用户 MacOS Sierra 设置上使用 Homebrew
How to use Homebrew on a Multi-user MacOS Sierra Setup
我有一个 Mac 由两个工程师共享。两者都有单独的用户帐户。两者都需要 运行 brew update
和 brew install...
偶尔。
如何设置它而不出现如下错误:
/usr/local must be writable!
?
是的,我可以让 UserA
接管 /usr/local
每次他想使用 brew 的权限(和 UserB
一样),但这似乎很多不必要的麻烦。
(截至 2020 年已删除,此答案已过时)
您还可以将组权限更改为 admin 或您的两个用户所在的其他组:
chgrp -R admin /usr/local
chmod -R g+w /usr/local
原始出处:https://gist.github.com/jaibeee/9a4ea6aa9d428bc77925
更新:
在 macOS High Sierra 中,您无法更改 /usr/local
的所有者、组或权限。所以你必须更改子文件夹的组和权限:
chgrp -R admin /usr/local/*
chmod -R g+w /usr/local/*
更新 2018 年 9 月,High Sierra 10.13.6
- 确定brew前缀的路径,即。将用于存储与使用自制软件相关的文件的路径
- 检查系统上所有需要访问
brew
的用户是否都在 admin 组 中
- 可选将用户添加到管理员组如果用户需要访问 brew
Will require access / privileges to use the sudo command
- 将 brew 前缀路径设置为由 admin 组递归拥有
- 将 brew 前缀路径设置为可由 admin 组中的所有用户递归写入
- 验证brew前缀的权限
- 酿造
echo $(brew --prefix)
echo $(groups $(whoami))
sudo dseditgroup -o edit -a $(whoami) -t user admin
sudo chgrp -R admin $(brew --prefix)
sudo chmod -R g+rwX $(brew --prefix)
ls -lah $(brew --prefix)
以上解决方案对我不起作用。但是 运行 下面的命令对我有用。
sudo chown -R $(whoami) $(brew --prefix)/*
来源:https://github.com/Homebrew/brew/issues/3228#issuecomment-333858695
最好的解决方案是添加一条 sudoers 记录以允许非特权用户 'joe' 以管理用户身份执行任何 'brew' 相关命令。
在 /etc/sudoers.d/joe 创建一个包含以下内容的文件:
joe ALL=(administrator) NOPASSWD: /usr/local/bin/brew
然后你可以运行这样冲泡:
sudo -Hu administrator brew install <smth>
以上工作正常,但如果您希望新文件自动继承这些权限,请设置一个继承的 ACL(否则只有倒瓶子的用户才能删除它)。在此处找到如何执行此操作的提示:https://gist.github.com/nelstrom/4988643
作为 root
运行 一次(假设“admin”组的所有用户都应该有访问权限):
cd /usr/local
/bin/chmod -R +a "group:admin allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit" Homebrew Caskroom Cellar bin
/usr/bin/chgrp -R admin Homebrew Caskroom Cellar bin
/bin/chmod -R g+rwX Homebrew Caskroom Cellar bin
ls -lae .
ls
上的 -e
显示 ACL。
更新:现在我使用特定的目录(见上文)因为它失败了(比如内存不足)
编辑:请使用 Vitim 的答案,这是正确的:)
macOS Mojave 10.14 的 Hacky 解决方案
这是 user4815162342 答案的编辑版本,对我来说开箱即用。
- 在“系统偏好设置”中,转到“用户与组”,单击左下角的锁定符号以解锁 user/group 创建,然后创建一个名为
brew-usergroup
的新组。将所有使用 brew 的用户添加到组中(如德国 macOS 的附加屏幕截图所示)。
在终端中,执行此操作:
echo $(brew --prefix)
echo $(groups $(whoami))
sudo dseditgroup -o edit -a $(whoami) -t user brew-usergroup
sudo chgrp -R brew-usergroup $(brew --prefix)/*
sudo chmod -R g+rwX $(brew --prefix)/*
ls -lah $(brew --prefix)
请注意,这不会再更改 brew 文件夹的权限(就像在其他答案中一样),它会更改 brew 文件夹的 subfolders/files。
brew install
现在应该可以正常工作,没有错误。
每个试图破解权限或使用 sudo
的答案都是错误的。
不要使用 sudo
并且不要跨用户帐户共享单个 brew 安装。
Homebrew docs 的正确答案是在一台机器上使用零个或一个全局 brew 安装,并为所有其他用户安装本地版本的 brew。
这在 Mac 上尤其重要,但在 Linux 上也适用。
这可以通过以下方法之一完成
Git approach
:对源代码库进行 git 检出
Untar-anywhere approach
: 将 tarball 扩展到某个目录 – 属于您的用户
Git接近
对于 git 方法,您需要克隆 brew。
为我的结帐任意选择我的用户主目录:
cd $HOME
git clone https://github.com/Homebrew/brew.git
./brew/bin/brew tap homebrew/core
随处解压方法
如 docs.brew.sh 中所述,运行 您的主目录中的此命令将创建 ~/brew
。
cd $HOME
mkdir brew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C brew
完成
对于任何一种安装方法,您都需要更改 PATH
以更喜欢新的 brew bin 目录,将类似的内容添加到 shell 的点文件中。
export PATH=$HOME/brew/bin:$PATH >> ~/.zshrc # or ~/.bashrc
然后运行重新加载并测试
exec $SHELL
which brew # see that brew is found in your path
由于这是新安装,您必须(再次)安装所有需要的 brew 包。
为每个用户安装自制程序
根据 brew documentation 您可以将其安装在每个用户主文件夹中
这样所有包都将保留在您的用户文件夹中,并且不会对其他用户可见或影响。作为一个很好的副作用,如果您删除该用户,您的系统上不会留下任何垃圾。因此系统范围的污染被最小化。
如果您为多个用户安装相同的软件包,这会以使用更多存储空间为代价。如果您的 SSD 非常小,请注意这一点。
说明
如果你的系统目前全局安装了brew,我推荐先uninstalling brew。 (可以看到brew安装在哪里运行ningwhich brew
)
如果您没有安装命令行工具,您必须先运行:
xcode-select --install
打开终端并运行:
- MacOS Catalina 10.15 或更新版本:
cd $HOME
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
echo 'export PATH="$HOME/homebrew/bin:$PATH"' >> .zprofile
- MacOS Mojave 10.14 或更早版本:
cd $HOME
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
echo 'export PATH="$HOME/homebrew/bin:$PATH"' >> .bash_profile
关闭终端window
再次打开终端,然后运行确保安装正确:
brew doctor
完成!
禁用自动更新
这不是必需的
我还发现在每次安装之前禁用 brew 更新所有包很有用。
- MacOS Catalina 10.15 或更新版本
echo 'HOMEBREW_NO_AUTO_UPDATE=1' >> $HOME/.zprofile
- MacOS Mojave 10.14 或更早版本
echo 'HOMEBREW_NO_AUTO_UPDATE=1' >> $HOME/.bash_profile
这里是 Homebrew 维护者的 official answer。
除此之外,我建议再做 3 个步骤。假设您有一个拥有 /usr/local/*
目录的管理员用户 niki
,并且您以另一个管理员用户 niki_at_work
.
的身份登录
- 使用以下内容创建
~/brew.sh
:
#!/bin/bash
comm="brew $@"
su niki -c "$comm"
chmod +x ~/brew.sh
- 将此别名添加到
.zshrc
或等效项:alias brew="~/brew.sh"
现在您可以像往常一样从 niki_at_work
冲泡(它会询问 niki
的密码):
brew update
brew install swiftlint
如果你想为 brew ex 使用专门的管理员用户。 brewadmin
你应该先 chown brew dirs:
sudo chown -R brewadmin:admin /usr/local/*
Homebrew 不是为不同的 Unix 用户设计的。来自 FAQ:
If you need to run Homebrew in a multi-user environment, consider creating a separate user account especially for use of Homebrew.
chmod
解决方案不可行,除非您确保 Homebrew 前缀中的每个新创建的文件也具有组写权限,默认 umask
并非如此 – 或者除非每次程序写入 Homebrew 前缀时,您都保留 运行 chmod
命令。
为每个用户维护单独的 Homebrew 安装确实解决了权限问题,但会产生许多其他问题,这就是为什么 not recommended by Homebrew:
However do yourself a favour and use the installer to install to the default prefix. Some things may not build when installed elsewhere. One of the reasons Homebrew just works relative to the competition is because we recommend installing here. Pick another prefix at your peril!
为了简化官方建议使用 Homebrew 专用帐户,您可以使用 sudo
轻松模拟该用户帐户。假设您将该用户命名为 homebrew
:
sudo -H -u homebrew brew update
-H
确保 HOME
设置为 homebrew
用户家(例如 /Users/homebrew
),以便 Homebrew 可以在那里进行管理。
-u homebrew
告诉 sudo
模拟 homebrew
用户帐户而不是默认的 root
。
我有一个 Mac 由两个工程师共享。两者都有单独的用户帐户。两者都需要 运行 brew update
和 brew install...
偶尔。
如何设置它而不出现如下错误:
/usr/local must be writable!
?
是的,我可以让 UserA
接管 /usr/local
每次他想使用 brew 的权限(和 UserB
一样),但这似乎很多不必要的麻烦。
(截至 2020 年已删除,此答案已过时)
您还可以将组权限更改为 admin 或您的两个用户所在的其他组:
chgrp -R admin /usr/local
chmod -R g+w /usr/local
原始出处:https://gist.github.com/jaibeee/9a4ea6aa9d428bc77925
更新:
在 macOS High Sierra 中,您无法更改 /usr/local
的所有者、组或权限。所以你必须更改子文件夹的组和权限:
chgrp -R admin /usr/local/*
chmod -R g+w /usr/local/*
更新 2018 年 9 月,High Sierra 10.13.6
- 确定brew前缀的路径,即。将用于存储与使用自制软件相关的文件的路径
- 检查系统上所有需要访问
brew
的用户是否都在 admin 组 中
- 可选将用户添加到管理员组如果用户需要访问 brew
Will require access / privileges to use the sudo command
- 将 brew 前缀路径设置为由 admin 组递归拥有
- 将 brew 前缀路径设置为可由 admin 组中的所有用户递归写入
- 验证brew前缀的权限
- 酿造
echo $(brew --prefix)
echo $(groups $(whoami))
sudo dseditgroup -o edit -a $(whoami) -t user admin
sudo chgrp -R admin $(brew --prefix)
sudo chmod -R g+rwX $(brew --prefix)
ls -lah $(brew --prefix)
以上解决方案对我不起作用。但是 运行 下面的命令对我有用。
sudo chown -R $(whoami) $(brew --prefix)/*
来源:https://github.com/Homebrew/brew/issues/3228#issuecomment-333858695
最好的解决方案是添加一条 sudoers 记录以允许非特权用户 'joe' 以管理用户身份执行任何 'brew' 相关命令。
在 /etc/sudoers.d/joe 创建一个包含以下内容的文件:
joe ALL=(administrator) NOPASSWD: /usr/local/bin/brew
然后你可以运行这样冲泡:
sudo -Hu administrator brew install <smth>
以上工作正常,但如果您希望新文件自动继承这些权限,请设置一个继承的 ACL(否则只有倒瓶子的用户才能删除它)。在此处找到如何执行此操作的提示:https://gist.github.com/nelstrom/4988643
作为 root
运行 一次(假设“admin”组的所有用户都应该有访问权限):
cd /usr/local
/bin/chmod -R +a "group:admin allow list,add_file,search,add_subdirectory,delete_child,readattr,writeattr,readextattr,writeextattr,readsecurity,file_inherit,directory_inherit" Homebrew Caskroom Cellar bin
/usr/bin/chgrp -R admin Homebrew Caskroom Cellar bin
/bin/chmod -R g+rwX Homebrew Caskroom Cellar bin
ls -lae .
ls
上的 -e
显示 ACL。
更新:现在我使用特定的目录(见上文)因为它失败了(比如内存不足)
编辑:请使用 Vitim 的答案,这是正确的:)
macOS Mojave 10.14 的 Hacky 解决方案
这是 user4815162342 答案的编辑版本,对我来说开箱即用。
- 在“系统偏好设置”中,转到“用户与组”,单击左下角的锁定符号以解锁 user/group 创建,然后创建一个名为
brew-usergroup
的新组。将所有使用 brew 的用户添加到组中(如德国 macOS 的附加屏幕截图所示)。
在终端中,执行此操作:
echo $(brew --prefix) echo $(groups $(whoami)) sudo dseditgroup -o edit -a $(whoami) -t user brew-usergroup sudo chgrp -R brew-usergroup $(brew --prefix)/* sudo chmod -R g+rwX $(brew --prefix)/* ls -lah $(brew --prefix)
请注意,这不会再更改 brew 文件夹的权限(就像在其他答案中一样),它会更改 brew 文件夹的 subfolders/files。
brew install
现在应该可以正常工作,没有错误。
每个试图破解权限或使用 sudo
的答案都是错误的。
不要使用 sudo
并且不要跨用户帐户共享单个 brew 安装。
Homebrew docs 的正确答案是在一台机器上使用零个或一个全局 brew 安装,并为所有其他用户安装本地版本的 brew。
这在 Mac 上尤其重要,但在 Linux 上也适用。
这可以通过以下方法之一完成
Git approach
:对源代码库进行 git 检出Untar-anywhere approach
: 将 tarball 扩展到某个目录 – 属于您的用户
Git接近
对于 git 方法,您需要克隆 brew。
为我的结帐任意选择我的用户主目录:
cd $HOME
git clone https://github.com/Homebrew/brew.git
./brew/bin/brew tap homebrew/core
随处解压方法
如 docs.brew.sh 中所述,运行 您的主目录中的此命令将创建 ~/brew
。
cd $HOME
mkdir brew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C brew
完成
对于任何一种安装方法,您都需要更改 PATH
以更喜欢新的 brew bin 目录,将类似的内容添加到 shell 的点文件中。
export PATH=$HOME/brew/bin:$PATH >> ~/.zshrc # or ~/.bashrc
然后运行重新加载并测试
exec $SHELL
which brew # see that brew is found in your path
由于这是新安装,您必须(再次)安装所有需要的 brew 包。
为每个用户安装自制程序
根据 brew documentation 您可以将其安装在每个用户主文件夹中
这样所有包都将保留在您的用户文件夹中,并且不会对其他用户可见或影响。作为一个很好的副作用,如果您删除该用户,您的系统上不会留下任何垃圾。因此系统范围的污染被最小化。
如果您为多个用户安装相同的软件包,这会以使用更多存储空间为代价。如果您的 SSD 非常小,请注意这一点。
说明
如果你的系统目前全局安装了brew,我推荐先uninstalling brew。 (可以看到brew安装在哪里运行ning
which brew
)如果您没有安装命令行工具,您必须先运行:
xcode-select --install
打开终端并运行:
- MacOS Catalina 10.15 或更新版本:
cd $HOME mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew echo 'export PATH="$HOME/homebrew/bin:$PATH"' >> .zprofile
- MacOS Mojave 10.14 或更早版本:
cd $HOME mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew echo 'export PATH="$HOME/homebrew/bin:$PATH"' >> .bash_profile
- MacOS Catalina 10.15 或更新版本:
关闭终端window
再次打开终端,然后运行确保安装正确:
brew doctor
完成!
禁用自动更新
这不是必需的 我还发现在每次安装之前禁用 brew 更新所有包很有用。
- MacOS Catalina 10.15 或更新版本
echo 'HOMEBREW_NO_AUTO_UPDATE=1' >> $HOME/.zprofile
- MacOS Mojave 10.14 或更早版本
echo 'HOMEBREW_NO_AUTO_UPDATE=1' >> $HOME/.bash_profile
这里是 Homebrew 维护者的 official answer。
除此之外,我建议再做 3 个步骤。假设您有一个拥有 /usr/local/*
目录的管理员用户 niki
,并且您以另一个管理员用户 niki_at_work
.
- 使用以下内容创建
~/brew.sh
:
#!/bin/bash
comm="brew $@"
su niki -c "$comm"
chmod +x ~/brew.sh
- 将此别名添加到
.zshrc
或等效项:alias brew="~/brew.sh"
现在您可以像往常一样从 niki_at_work
冲泡(它会询问 niki
的密码):
brew update
brew install swiftlint
如果你想为 brew ex 使用专门的管理员用户。 brewadmin
你应该先 chown brew dirs:
sudo chown -R brewadmin:admin /usr/local/*
Homebrew 不是为不同的 Unix 用户设计的。来自 FAQ:
If you need to run Homebrew in a multi-user environment, consider creating a separate user account especially for use of Homebrew.
chmod
解决方案不可行,除非您确保 Homebrew 前缀中的每个新创建的文件也具有组写权限,默认 umask
并非如此 – 或者除非每次程序写入 Homebrew 前缀时,您都保留 运行 chmod
命令。
为每个用户维护单独的 Homebrew 安装确实解决了权限问题,但会产生许多其他问题,这就是为什么 not recommended by Homebrew:
However do yourself a favour and use the installer to install to the default prefix. Some things may not build when installed elsewhere. One of the reasons Homebrew just works relative to the competition is because we recommend installing here. Pick another prefix at your peril!
为了简化官方建议使用 Homebrew 专用帐户,您可以使用 sudo
轻松模拟该用户帐户。假设您将该用户命名为 homebrew
:
sudo -H -u homebrew brew update
-H
确保HOME
设置为homebrew
用户家(例如/Users/homebrew
),以便 Homebrew 可以在那里进行管理。-u homebrew
告诉sudo
模拟homebrew
用户帐户而不是默认的root
。