如何在多用户MacOS Sierra安装程序上使用Homebrew

Jon*_*ter 32 permissions macos homebrew multi-user

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

如何设置这没有得到这样的错误: /usr/local must be writable!

是的,我可以UserA接受/usr/local每次他想使用brew 的权限(和相同UserB),但这似乎是很多不必要的麻烦.

use*_*342 61

您还可以将组权限更改为管理员或您的两个用户所在的其他组:

chgrp -R admin /usr/local
chmod -R g+w /usr/local
Run Code Online (Sandbox Code Playgroud)

原始来源:https://gist.github.com/jaibeee/9a4ea6aa9d428bc77925

更新:

在macOS High Sierra中,您无法更改所有者,组或权限/usr/local.因此,您必须更改子文件夹的组和权限:

chgrp -R admin /usr/local/*
chmod -R g+w /usr/local/*
Run Code Online (Sandbox Code Playgroud)

更新 2018年9月,High Sierra 10.13.6

  1. 确定brew前缀的路径,即.用于存储与使用homebrew相关的文件的路径
  2. 检查系统上需要访问权限的所有用户是否brew都在admin组中
  3. 可选如果用户需要访问brew,则将用户添加到管理组

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

  4. 将brew前缀路径设置为由admin组递归拥有
  5. 将brew前缀路径设置为admin组中的所有用户可递归写入
  6. 验证brew前缀的权限
  7. 酿造

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)
Run Code Online (Sandbox Code Playgroud)

  • 不要添加`sudo`以避免`不允许操作'.在命令中添加`/*`,即:`sudo chgrp -R admin $(brew --prefix)/*`.[源(https://github.com/Homebrew/brew/issues/3228) (5认同)
  • 这个解决方案很合理,但有些软件包可能会拒绝使用这些权限.例如,Postgres抛出:'FATAL:数据目录"/ usr/local/var/postgres"具有组或世界访问细节:权限应为u = rwx(0700). (2认同)
  • 这个答案可能需要一些清理......最后的代码块是什么?另一个更新? (2认同)
  • zsh 在像这样调整所有者和烫发时也会抱怨;compaudit 错误每个新外壳。 (2认同)

jer*_*ryb 48

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

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

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

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

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

  1. Git approach:对源代码库进行 git checkout
  2. Untar-anywhere approach: 将 tarball 扩展到某个目录 - 由您的用户拥有

Git 方法

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

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

cd $HOME
git clone https://github.com/Homebrew/brew.git
./brew/bin/brew tap homebrew/core
Run Code Online (Sandbox Code Playgroud)

Untar-Anywhere 方法

docs.brew.sh 所述,在您的主目录中运行此命令,这将创建~/homebrew.

mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
Run Code Online (Sandbox Code Playgroud)

整理起来

对于任何一种安装方法,您都需要更改PATH为更喜欢新的 brew bin 目录,将类似的内容添加到您的 shell 的 dot 文件中。

export PATH=$HOME/homebrew/bin:$PATH >> ~/.zshrc # or ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

然后运行它来重新加载和测试

exec $SHELL
which brew # see that brew is found in your path
Run Code Online (Sandbox Code Playgroud)

由于这是一个新安装,您必须(再次)安装所有所需的 brew 包。

  • 然而,应该提到的是,这种方法不受支持,你永远不能在他们的错误跟踪器中提出任何问题,他们甚至会在不查看问题的情况下关闭,文档https://docs.brew.sh/Installation#untar-anywhere -unsupported,https://docs.brew.sh/Installation#multiple-installations-unsupported 它有一个缺点,即您安装的所有内容都将被编译,并且不能使用标准瓶子,因为瓶子假定标准酿造位置 /usr/local。 (9认同)
  • 来自文档“选择另一个前缀,后果自负!” (5认同)
  • 这对我有用,但在我的情况下必须使用 https 克隆存储库。`cd $HOME; git 克隆 https://github.com/Homebrew/homebrew-core.git;git 克隆 https://github.com/Homebrew/brew.git` (2认同)
  • 我终于找到了一个用例,我的解决方案不能很好地工作:nvm 讨厌在 /usr/local/bin 之外,但这个解决方案已经使用了很多年,否则为零麻烦。 (2认同)

Vit*_*.us 23

为每个用户安装自制程序

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

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

如果您为多个用户安装相同的软件包,那么这是以使用更多存储空间为代价的。如果您的 SSD 非常小,需要注意一些事情。

指示

  1. 如果您当前在系统上全局安装了brew ,我建议首先卸载brew。(你可以看到brew安装在哪里运行which brew

  2. 如果您没有安装命令行工具,则必须先运行以下命令:

    xcode-select --install
    
    Run Code Online (Sandbox Code Playgroud)
  3. 打开终端并运行:

    • 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
      
      Run Code Online (Sandbox Code Playgroud)
    • 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
      
      Run Code Online (Sandbox Code Playgroud)
  4. 关闭终端窗口

  5. 再次打开终端,然后运行以下命令以确保安装正确:

    brew doctor
    
    Run Code Online (Sandbox Code Playgroud)
  6. 完毕!


禁用自动更新

这不是必需的, 我还发现在每次安装某些东西之前禁用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

  • 我喜欢这个答案,因为它使brew保持在用户本地(不共享)。但 `brew doctor` 返回以下内容。这是预期的吗?`警告:您的 Homebrew 的前缀不是 /usr/local。Homebrew 的一些瓶子(二进制包)只能与默认前缀(/usr/local)一起使用。您将遇到某些公式的构建失败。请创建拉取请求,而不是在 Homebrew 的 GitHub、Twitter 或任何其他官方渠道上寻求帮助。您有责任解决在运行此不受支持的配置时遇到的任何问题。 (4认同)
  • 这是唯一的答案,实际上1.仅为当前用户安装brew,2.正确设置PATH,以便在重新启动后也可以使用!谢谢维蒂姆! (3认同)

Val*_*Val 12

Homebrew 并不是为不同的 Unix 用户使用而设计的。来自常见问题解答

\n
\n

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

\n
\n

chmod解决方案不可行,除非您确保 Homebrew 前缀中的每个新创建的文件也具有组写入权限(默认的umask\xe2\x80\x93 不是这种情况),或者除非您chmod每次程序写入时都继续运行该命令到 Homebrew 前缀。

\n

为每个用户维护单独的 Homebrew 安装确实可以解决权限问题,但会产生许多其他问题,这就是Homebrew 不推荐的原因:

\n
\n

不过,帮自己一个忙,使用安装程序安装到默认前缀。有些东西安装在其他地方时可能无法构建。Homebrew 相对于竞争对手表现出色的原因之一是我们建议在此处安装。选择另一个前缀后果自负!

\n
\n
\n

为了简化官方建议使用 Homebrew 专用帐户的要求,您可以使用sudo来轻松模拟该用户帐户。假设您指定该用户homebrew

\n
sudo -H -u homebrew brew update\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • -H确保HOME设置为homebrew用户主目录(例如/Users/homebrew),以便 Homebrew 可以在那里进行内务处理。
  • \n
  • -u homebrew告诉sudo模拟homebrew用户帐户而不是默认的root.
  • \n
\n


Har*_*ren 11

Hombrew安装了软件包/usr/local,没有打破它安装的许多软件包,你无能为力.为所有用户添加读写权限,如下所示:

sudo chmod -R +rw /usr/local
Run Code Online (Sandbox Code Playgroud)

请注意,由于这是一个系统文件夹,所有用户将共享相同的brew安装.一个用户可以删除其他人安装的软件包,依此类推.所以一定要协调以避免问题.

  • 这似乎是一个巨大的安全风险.为什么不在管理组中为用户添加写权限? (11认同)
  • 这是一个糟糕的主意。 (2认同)

Sli*_*liq 8

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

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

  1. 在“系统偏好设置”中,转到“用户和组”,单击左下角的锁定符号以解锁用户/组的创建,然后创建一个名为的新组brew-usergroup。将所有使用brew的用户添加到组中(如附件中来自德国macOS的屏幕截图)。

在此处输入图片说明

  1. 在终端中,执行以下操作:

    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)
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,这不再更改Brew文件夹的权限(就像在其他答案中一样),它更改了brew文件夹的子文件夹/文件。 brew install现在应该可以正常工作而没有错误了。

  • 这看起来是一个优雅的解决方案,但不幸的是,它并不比简单地为管理员做同样的事情(不创建额外的组)更好。无论哪种方式,我都会收到以下错误消息: cp: utimes: /usr/local/Cellar/readline/.: Operation not allowed cp: chmod: /usr/local/Cellar/readline/.: Operation not allowed (3认同)

DrP*_*ick 7

上面的方法工作正常,但是如果您希望新文件自动继承那些权限,请设置一个继承的ACL(否则,只有倒瓶的用户才能删除它)。在这里找到了如何执行此操作的提示:https : //gist.github.com/nelstrom/4988643

由于root运行一次(假设组“管理员”的所有用户都应该有机会获得):

cd /usr/local
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
chgrp -R admin Homebrew Caskroom Cellar bin
chmod -R g+rwX Homebrew Caskroom Cellar bin
ls -lae .
Run Code Online (Sandbox Code Playgroud)

-els节目的ACL。

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


小智 5

这是一位 Homebrew 维护者的官方回答。

创建第三个管理员用户(例如 homebrew),然后:

sudo chown -R homebrew:admin /usr/local/*

然后,所有进一步的写入操作(即安装、更新、升级等)都应该由该用户的其他人通过 su 或 sudo 的功能来完成,具体取决于您的偏好:

su homebrew -c 'brew update'

在这方面,Homebrew 和系统包管理器之间只有一个区别:前者让您决定向哪个用户授予所有权,而后者将其修复为 root。

我自己的建议

niki假设您已经有一个拥有该目录的管理员用户/usr/local/*,并且您以另一个管理员用户的身份登录niki_at_work。在这种情况下,您不一定需要为自制程序创建新帐户。

  1. 使用这些内容创建~/brew.sh
#!/bin/bash
comm="brew $@"
su niki -c "$comm"
Run Code Online (Sandbox Code Playgroud)
  1. chmod +x ~/brew.sh
  2. 将此别名添加到.zshrc或等效项:alias brew="~/brew.sh"

现在你可以niki_at_work像往常一样进行冲泡(它会询问 的niki密码):

brew update
brew install swiftlint
Run Code Online (Sandbox Code Playgroud)

如果您确实想为brew ex 使用专用的管理员用户。brewadmin你应该首先 chown 酿造目录: sudo chown -R brewadmin:admin /usr/local/*