如何在多用户 MacOS Sierra 设置中使用 Homebrew

Posted

技术标签:

【中文标题】如何在多用户 MacOS Sierra 设置中使用 Homebrew【英文标题】:How to use Homebrew on a Multi-user MacOS Sierra Setup 【发布时间】:2017-06-09 23:27:31 【问题描述】:

我有一台由两位工程师共享的 Mac。两者都有单独的用户帐户。两者都需要偶尔运行brew updatebrew install...

如何在不出现以下错误的情况下进行设置: /usr/local must be writable!?

是的,我可以让UserA 每次他想使用 brew 时接管/usr/local 的权限(UserB 也是如此),但这似乎是很多不必要的麻烦。

【问题讨论】:

标记为已接受的答案是不明智和糟糕的安全实践。 @user4815162342 下面的答案更明智。 请接受不同的答案,或至少不接受已接受的答案,以便将其删除。 【参考方案1】:

您还可以将组权限更改为 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前缀的路径,即。用于存储与使用 homebrew 相关的文件的路径 检查系统上所有需要访问brew 的用户是否都在admin 组中 可选将用户添加到管理员组如果用户需要访问 brew

    需要访问/特权才能使用 sudo 命令

    将 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 否则我会收到 Operation not permitted 错误消息 不要添加sudo 以避免Operation not permitted。在命令中添加/*,即:sudo chgrp -R admin $(brew --prefix)/*。 source 这个解决方案是合理的,但是一些包可能拒绝使用这样的权限。例如,Postgres 会抛出:FATAL: data directory "/usr/local/var/postgres" has group or world access DETAIL: Permissions should be u=rwx (0700). 这个答案可能需要一些清理......最后的代码块是什么?另一个更新? zsh 在所有者和权限被这样调整时也会抱怨; compaudit 错误每个新的外壳。【参考方案2】:

每一个试图破解权限或使用sudo 的答案都是错误的。

不要使用sudo,也不要跨用户帐户共享单个 brew 安装。

Homebrew docs 的正确答案是在机器上使用零个或一个全局 brew 安装,并为所有其他用户安装本地版本的 brew。

这在 Mac 上尤其重要,但也适用于 Linux。

这可以通过以下方法之一来完成

    Git approach: 对源代码库进行 git checkout Untar-anywhere approach:将 tarball 扩展至某个目录——归您的用户所有

Git 方法

对于 git 方法,您需要克隆 brew。

任意选择我的用户主目录进行结帐:

cd $HOME
git clone https://github.com/Homebrew/brew.git
./brew/bin/brew tap homebrew/core

Untar-Anywhere 方法

如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 包。

【讨论】:

这对我有用,但在我的情况下,必须使用 https 克隆 repo。 cd $HOME; git clone https://github.com/Homebrew/homebrew-core.git; git clone https://github.com/Homebrew/brew.git @SebMa 完成,如果我做对了请告诉我 来自文档Pick another prefix at your peril! 我终于找到了一个用例,我的解决方案不能很好地工作:nvm 讨厌在 /usr/local/bin 之外,但这个解决方案已经使用了多年,否则零麻烦。 @Sliq 非常感谢您的反馈。你是对的,我相信我已经编辑并修复了你提到的问题。【参考方案3】:

为每个用户安装自制软件

根据brew documentation,您可以将其安装在每个用户主文件夹中

这样所有的包都将保留在您的用户文件夹中,并且不会显示或影响其他用户。如果您删除该用户,一个很好的副作用是,您的系统上不会留下任何垃圾。因此,系统范围的污染被最小化。

如果您为多个用户安装相同的软件包,则会以使用更多存储空间为代价。如果您的 SSD 非常小,请注意这一点。

说明

    如果您目前全局在您的系统上安装了 brew,我建议首先使用uninstalling brew。 (运行which brew可以看到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
    

    关闭终端窗口

    再次打开终端,并运行它以确保您的安装正确:

    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

【讨论】:

这实际上是唯一的答案 1. 仅为当前用户安装 brew 和 2. 正确设置 PATH 以便在重新启动后也可以使用!谢谢维提姆! 如 Homebrew 安装文档中所述:“帮自己一个忙,安装到 macOS Intel 上的 /usr/local、macOS ARM 上的 /opt/homebrew 和 /home/linuxbrew/。 Linux 上的 linuxbrew”并继续说“选择另一个前缀,后果自负!”所以我不确定这种方法是否可取。 我喜欢这个答案,因为它将 brew 保留给用户本地(不共享)。但是brew doctor 返回以下内容。这是预期的吗? Warning: Your Homebrew's prefix is not /usr/local. Some of Homebrew's bottles (binary packages) can only be used with the default prefix (/usr/local). You will encounter build failures with some formulae. Please create pull requests instead of asking for help on Homebrew's GitHub, Twitter or any other official channels. You are responsible for resolving any issues you experience while you are running this unsupported configuration. 尽管这个答案很棒,但它确实有其局限性。 1. 如果在 $HOME 目录中使用隔离的多用户 homebrew 安装进行特定安装,并且希望将此类安装与 github 操作一起使用,即。 homebrew 的test-bot 将无法使用标准设置执行操作。这可以看作是 homebrew 提供的 actions runner 的限制,但是使用带有 test-bot brew 的 vanilla github 操作需要安装在/usr/local 我喜欢你包含 git 的 xcode 步骤和 brew doctor。【参考方案4】:

编辑:请使用 Vitim 的答案,它是正确的 :)

适用于 macOS Mojave 10.14 的 Hacky 解决方案

这是user4815162342 答案的编辑版本,对我来说开箱即用并不适用。

    在“系统偏好设置”中,转到“用户和组”,单击左下角的锁定符号以解锁用户/组创建,然后创建一个名为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 文件夹的子文件夹/文件。 brew install 现在应该可以正常工作而不会出现错误。

【讨论】:

这看起来像是一个优雅的解决方案,但不幸的是,它并不比简单地为管理员做同样的事情更好(不创建额外的组)。无论哪种方式,我都会收到以下错误消息: cp: utimes: /usr/local/Cellar/readline/.: Operation not allowed cp: chmod: /usr/local/Cellar/readline/.: Operation not allowed 我同意,我认为最好的办法是推动 brew 开发人员从核心解决整个问题! 我刚才遇到了同样的cp: utimes: /usr/local/Cellar/XXX/.: Operation not permitted错误,发现是由组为“staff”而不是“admin”的文件夹引起的,虽然我跑了chgrp -R admin /usr/local/...奇怪,但是已修复 :) find /usr/local/ -not -group admin -ls 可能会有所帮助...【参考方案5】:

上面的工作正常,但是如果您希望新文件自动继承这些权限,请设置一个被继承的 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。

更新:现在我使用特定目录(见上文),因为它失败了(比如内存不足)

【讨论】:

可能想为我们这些为 macOS 安装 GNU coreutils 的人添加 /bin/chmod 这太棒了!我正在尝试一下。很好奇为什么您可能没有包含其他一些 ACL,例如 writesecurity(这似乎是使脚本可执行所必需的)。在全新的 Homebrew 安装后,我最终对所有 /usr/local 目录执行了 chmod -R +a 'group:admin allow readattr,writeattr,readextattr,writeextattr,readsecurity,writesecurity,list,search,add_file,add_subdirectory,delete_child,read,write,append,execute,file_inherit,directory_inherit' *【参考方案6】:

这是 Homebrew 维护者的official answer。

除此之外,我建议再执行 3 个步骤。假设您有一个管理员用户 niki 拥有 /usr/local/* 目录,并且您以另一个管理员用户 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/*

【讨论】:

我没有看到回复你的人是官方维护者的证据。但是这个策略也类似于我以前维护的一个工具:github.com/brewdo/brewdo 它在大多数情况下运行良好,但由于偶尔的不兼容以及 Homebrew 本身使用操作系统沙盒来阻止外部更改的事实,几年前我停止了维护它。 Homebrew 安装——我开始使用这个工具的早期原因。无论如何,根据经验,我认为这个答案过于简单化,可能在大多数情况下都有效,但以后可能会出现问题。【参考方案7】:

(2020年删除,此答案已过时)

【讨论】:

这似乎是一个巨大的安全风险。为什么不给 admin 组的用户添加写权限呢? 这在 Mac OS High Sierra 上不起作用。 @user4815162342 的回答对我有用。 这是个糟糕的主意。【参考方案8】:

最好的解决方案是添加一条 sudoers 记录,以允许非特权用户 'joe' 以管理用户身份执行任何与 'brew' 相关的命令。

在 /etc/sudoers.d/joe 创建一个包含以下内容的文件:

joe ALL=(administrator) NOPASSWD: /usr/local/bin/brew

然后你可以像这样运行brew:

sudo -Hu administrator brew install <smth>

【讨论】:

这听起来很危险。如果“joe”创建了一个做坏事的 Homebrew 包怎么办? @suragch 我猜如果您允许 joe 不仅以这种方式,而且以任何方式安装任何系统范围的软件包,您将无法避免这种危险。【参考方案9】:

Homebrew 不是为不同的 Unix 用户设计的。来自FAQ:

如果您需要在多用户环境中运行 Homebrew,请考虑创建一个单独的用户帐户,尤其是使用 Homebrew。

chmod 解决方案是不可行的,除非您确保在 Homebrew 前缀中的每个新创建的文件也具有组写入权限,默认的 umask 不是这种情况 - 或者除非您继续运行 @987654325每次程序写入 Homebrew 前缀时使用 @ 命令。

为每个用户维护单独的 Homebrew 安装确实会对权限问题进行排序,但会产生许多其他问题,这就是为什么它是 not recommended by Homebrew:

不过,请帮自己一个忙,使用安装程序安装到默认前缀。有些东西在其他地方安装时可能无法构建。 Homebrew 之所以能在竞争中发挥作用的原因之一是因为我们建议在此处安装。 选择另一个前缀,后果自负!


为了简化官方建议使用 Homebrew 专用帐户,您可以使用 sudo 轻松模拟该用户帐户。假设您将该用户命名为homebrew

sudo -H -u homebrew brew update
-H 确保将 HOME 设置为 homebrew 用户主页(例如 /Users/homebrew),以便 Homebrew 可以在那里进行内部管理。 -u homebrew 告诉 sudo 模拟 homebrew 用户帐户,而不是默认的 root

【讨论】:

【参考方案10】:

上述解决方案对我不起作用。但是运行下面的命令对我有用。

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

来源:https://github.com/Homebrew/brew/issues/3228#issuecomment-333858695

【讨论】:

如果您想使用多个用户,这实际上不是一个解决方案。您必须在每个用户切换上执行该命令。 这在多用户环境中不起作用。

以上是关于如何在多用户 MacOS Sierra 设置中使用 Homebrew的主要内容,如果未能解决你的问题,请参考以下文章

如何制作macos sierra

macOS Sierra 如何打开任何来源

macOS Sierra系统有几个“资源库”文件夹?分别有啥用?

macOS Sierra 系统设置中的 Kerberos 身份验证

如何从MacOS Catalina降级到 MacOS High Sierra,几步轻松搞定

macbook更新了macOS Sierra之后preview预览功能不能使用三指查询