zsh compinit:不安全的目录

Ale*_*lex 179 zsh zsh-completion

它是什么意思,我该如何解决?

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
Run Code Online (Sandbox Code Playgroud)

运行compaudit返回如下:

There are insecure directories:
/usr/local/share/zsh/site-functions
Run Code Online (Sandbox Code Playgroud)

cha*_*rit 261

这为我修好了:

$ cd /usr/local/share/zsh
$ sudo chmod -R 755 ./site-functions
Run Code Online (Sandbox Code Playgroud)

Credit:zsh邮件列表上的帖子


编辑:正如@biocyberman在评论中指出的那样.您可能还需要更新所有者site-functions:

$ sudo chown -R root:root ./site-functions
Run Code Online (Sandbox Code Playgroud)

在我的机器上(OSX 10.9),我不需要这样做但是YMMV.

EDIT2:在OSX 10.11上,只有这个工作:

$ cd /usr/local/share/
$ sudo chmod -R 755 zsh
$ sudo chown -R root:staff zsh
Run Code Online (Sandbox Code Playgroud)

用户:staff是OSX上正确的默认权限.

  • @kirill_igum 的“no root”是指“no root _access_”吗?如果是这样,那么您应该将文件复制到您有权访问的文件夹中,修复您的 `.zshenv` 和 `.zshrc` 以使用新文件夹并在新文件夹上执行与我发布的相同的 `chmod`文件夹。 (3认同)
  • 注意:我在 `/usr/local/share/zsh/site-functions` 中有指向 `/usr/local/Cellar` 的符号链接,并且在此之前也必须使用 `chown -R root:staff /usr/local/Cellar` . (3认同)
  • 这个答案对我不起作用。下面的“compaudit”答案对我有用。 (3认同)
  • 没有澄清 macOS 应该是 `root:staff` 还是 `user:staff`。令人困惑。 (2认同)
  • 这并没有解决它。 (2认同)

Wen*_* Li 183

compaudit | xargs chmod g-w
Run Code Online (Sandbox Code Playgroud)

将采取行动,请参阅http://www.wezm.net/technical/2008/09/zsh-cygwin-and-insecure-directories/

  • 更好的答案,应该注意的是,`compaudit`可以用来诊断这些问题并修复它们. (7认同)
  • 请注意,您可能还必须将文件的所有者更改为root - 我必须:`compaudit | xargs chown root` (7认同)
  • 就是这个!删除对组的写入权限.谢谢 (5认同)
  • 这与 Homebrew 推荐的解决方案非常相似:https://docs.brew.sh/Shell-Completion。 (3认同)
  • 这对我来说绝对是最好的解决方案.我用Homebrew安装了zsh和zsh-completions,所以很明显不想将它改为root所有. (2认同)
  • `comaudit | xargs chmod gw`和`ompaudit | xargs chown root`也为我工作,似乎让HomeBrew感到高兴。有人可以解释一下发生了什么。 (2认同)
  • 尝试了上述答案但没有成功,但这对我来说是成功的。谢谢你!我使用的是 macOS Big Sur。 (2认同)

Bra*_*ndt 132

一旦您了解了原因,解决方案就变得简单明确

  • 原因:输出的目录compaudit具有其他人的权限(世界可写);或者那些文件归root或你自己以外的其他人所有。

  • 示例:就我而言,compaudit给了我:

% compaudit 
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

如果我们列出我们拥有的那些文件/目录的权限(在这种情况下)

% ls -lh /usr/local/share 
total 0
drwxr-xr-x  12 chbrandt  admin   384B Aug 14 10:45 aclocal
drwxr-xr-x   8 chbrandt  admin   256B Aug 14 10:45 doc
drwxr-xr-x   3 chbrandt  admin    96B Jul 24 21:00 fish
lrwxr-xr-x   1 chbrandt  admin    36B Aug 14 10:45 gettext -> ../Cellar/gettext/0.21/share/gettext
lrwxr-xr-x   1 chbrandt  admin    41B Aug 14 10:45 gettext-0.21 -> ../Cellar/gettext/0.21/share/gettext-0.21
lrwxr-xr-x   1 chbrandt  admin    37B Aug 14 10:45 gtk-doc -> ../Cellar/libidn2/2.3.0/share/gtk-doc
drwxr-xr-x   9 chbrandt  admin   288B Aug 14 10:45 info
drwxr-xr-x  58 chbrandt  admin   1.8K Aug 14 10:45 locale
lrwxr-xr-x   1 chbrandt  admin    41B Jul 27 17:12 luajit-2.0.5 -> ../Cellar/luajit/2.0.5/share/luajit-2.0.5
drwxr-xr-x   5 chbrandt  admin   160B Jul 27 17:12 man
lrwxr-xr-x   1 chbrandt  admin    33B Aug 14 10:45 nvim -> ../Cellar/neovim/0.4.4/share/nvim
drwxrwxr-x   3 chbrandt  admin    96B Jul 24 20:57 zsh
%
% ls -lh /usr/local/share/zsh 
total 0
drwxrwxr-x  4 chbrandt  admin   128B Jul 24 21:00 site-functions
%
% ls -lh /usr/local/share/zsh/site-functions 
total 0
lrwxr-xr-x  1 chbrandt  admin    39B Jul 24 21:00 _brew -> ../../../Homebrew/completions/zsh/_brew
lrwxr-xr-x  1 chbrandt  admin    44B Jul 24 21:00 _brew_cask -> ../../../Homebrew/completions/zsh/_brew_cask
Run Code Online (Sandbox Code Playgroud)

现在我们很容易发现问题,不是吗?请注意zsh/zsh/site-functions目录与其他目录的不同之处... zsh 不欣赏w允许admin组修改它们的“ ” 。

  • 解决方案:关闭该组可写权限!
% chmod g-w /usr/local/share/zsh 
% chmod g-w /usr/local/share/zsh/site-functions 
Run Code Online (Sandbox Code Playgroud)

就是这样!你很高兴去。打开一个新终端,您应该不会再看到“ zsh compinit: insecure directories”消息;)

  • 这是最好的答案。为这群家伙点赞。谢谢你详细的布兰特你摇滚 (14认同)
  • 这是最好的答案,因为它解释了问题,并在应用解决方案时展示了一个真实的具体示例 (4认同)
  • @JaapWijnen 我不认为它们被_改变了_,那些目录可能是像那样_创建的。我什至不认为这是一个错误(如果你仔细考虑整个环境,并且“chbrandt”是“su”,“admin”是一个特权组等等......)。特别是在这种情况下 - 现在回答你的问题 - 那些“错误”的权限可能是 zsh/homebrew 领域中的一个小错误的结果......或者是一个被误解的功能;) (2认同)
  • 出色的。这解决了我在尝试在 zsh 中启用 aws cli 命令完成时遇到的问题。如果你想要一个衬垫,这里是“compaudit |” sed -n '2,$ p' | sed -n '2,$ p' | xargs -I{} chmod gw {}` (2认同)

Han*_*han 54

自 High Sierra 更新以来,这适用于我的 Mac。

删除组写入权限:

sudo chmod g-w /usr/local/share/zsh/site-functions
sudo chmod g-w /usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

最好将更改限制在 zsh 目录中。

  • 这是在 Mac Catalina 上唯一对我有用的修复 (6认同)
  • 此修复程序在 MacOS Catalina 上也适用于我。谢谢! (4认同)
  • sudo chmod gw /usr/local/share/zsh/site-functions (在 mac 10.15 中为我工作) (3认同)

lin*_*ndy 46

大多数答案都带有解决方案,但是没有提到为什么会出现此警告.下面是ZSH的摘录compinit:

出于安全原因,compinit还会检查完成系统是使用非root用户还是当前用户拥有的文件,还是使用世界或组可写或不属于root用户或当前用户的目录中的文件.如果找到这样的文件或目录,compinit将询问是否应该真正使用完成系统.要避免这些测试并使所有文件都可以在不问的情况下使用,请使用选项-u,并使compinit静默忽略所有不安全的文件和目录使用选项-i.给出-C选项时,将完全跳过此安全检查.

因此,解决方案意味着修复以下一个(或全部):

另一种方法是使用跳过这些检查

compinit -u
Run Code Online (Sandbox Code Playgroud)

但我并没有真正建议这一点,因为在地毯下隐藏问题只能在短期内解决问题.

  • 谢谢。我很惊讶人们会在没有真正理解问题的情况下随机键入命令。 (8认同)
  • 那么多用户系统呢?在这种情况下,主目录外部文件(例如,/ usr / local /)的“ chown -R“ $(whoami)”)将不起作用。根据文档,将文件设为根目录拥有所有权更有意义吗? (2认同)
  • 我最喜欢这个答案。让我思考为什么这件事发生在我身上。事实证明,这是在将另一个用户添加到我的用户的主组后发生的。$HOME/.antigen/bundles 下的目录由我的用户和我的组拥有。因此,就我而言,从组中删除该用户解决了问题。 (2认同)
  • 这是数十个答案中排名前三的答案之一。与其他几个很好的答案一样,它解释了发生的情况并提供了解决方案。 (2认同)
  • 这是一个很好的答案!干得好,谢谢。这应该是最好的答案。 (2认同)

num*_*er5 23

当我sudo -i启动root shell时,我得到了相同的警告,@ chakrit的解决方案对我不起作用.

但是我发现-ucompinit作品的切换,例如你的.zshrc/zshenv或​​你打过的地方compinit

compinit -u
Run Code Online (Sandbox Code Playgroud)

注意:不建议用于生产系统

另见http://zsh.sourceforge.net/Doc/Release/Completion-System.html#Initialization


Fre*_*icK 18

我最近在 Catalina 上也收到了同样的警告。一个简单的解决方法是将它放在 .zshrc 的顶部

ZSH_DISABLE_COMPFIX=true
Run Code Online (Sandbox Code Playgroud)

  • 这是在 macOS Catalina 10.15.5 上对我有帮助的唯一解决方案!所有其他的东西,比如“compaudit |” xargs chmod go-w` 或 `compinit -u` 似乎不适用于此版本的 macOS (2认同)
  • 对于 MacOS Catalina 10.15.5,这是唯一对我有用的解决方案@Deliaz 谢谢@FredericK!!! (2认同)

Ber*_*vik 18

这个答案主要是我自己将来使用的参考,因为大多数答案都没有提供成熟的解决方案。这里是:

第一次运行:

compinit
Run Code Online (Sandbox Code Playgroud)

compaudit如果以上不起作用,请使用

对于打印的每个路径,运行以下命令:

sudo chown $(whoami) PATH_HERE

sudo chmod -R 755 PATH_HERE
Run Code Online (Sandbox Code Playgroud)

简单的例子,假设运行 compinit 后打印的路径之一是“/usr/local/share/zsh”。然后:

sudo chown $(whoami) /usr/local/share/zsh

sudo chmod -R 755 /usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

  • 只需运行“sudo chown $(whoami) PATH_HERE”对我有用。谢谢! (3认同)
  • 这个答案对我来说是一个很好的答案。 (3认同)
  • 这是唯一真正对我有用的方法。谢谢 (2认同)

小智 17

此命令以正确的权限更新所有文件/文件夹:

compaudit | xargs chmod g-w

您不需要使用sudo来更改所有者 -除非文件属于 root

(在 macOS BigSur 上测试)


Sud*_*hir 13

在过去的五月里,我一直遇到这个问题,尝试了一些方法,但没有成功。最后对我有帮助的是这个。获取不安全目录的列表,然后按如下所述设置所有目录的 chmod。

CLI# compaudit
There are insecure directories:
/usr/local/share/zsh
CLI# sudo chmod -R 755 /usr/local/share/zsh
Password:
Run Code Online (Sandbox Code Playgroud)


小智 12

运行此命令对我有用mac OS Catalina

compaudit | xargs chmod g-w,o-w


jpm*_*tin 12

MAC OS X 解决方案:

$ sudo chmod -R 755 /usr/local/share/zsh
$ sudo chown -R root:staff /usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

还有“user:staff = OSX 上的默认 root 用户。


小智 11

我尝试了发布的所有解决方案,最终没有一个适合我的特定情况。然而,我想向那些为我指明方向的用户表示感谢,他们指出所有权是多个帐户的真正问题,而不是模式。我将这个答案发布给具有类似设置的其他人(M1 + 两个帐户 + /opt/homebrew/share)。

这是我的设置:

我有一台 M1,运行 macOS Monterey 12.0.1,使用 Homebrew。

我有两个帐户,一个管理员和一个普通用户(工作需要分开)。我只在普通用户上遇到不安全目录问题,两个用户都使用相同的自制程序设置,以下目录和文件受到该问题的影响:

/opt/homebrew/completions/zsh/_brew
/opt/homebrew/share/zsh
/opt/homebrew/share/zsh/site-functions
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/share/zsh/site-functions/_brew_services
/opt/homebrew/share/zsh/site-functions/_cargo
/opt/homebrew/share/zsh/site-functions/_gh
/opt/homebrew/share/zsh/site-functions/_git
/opt/homebrew/share/zsh/site-functions/_j
/opt/homebrew/share/zsh/site-functions/_lf
/opt/homebrew/share/zsh/site-functions/_task
/opt/homebrew/share/zsh/site-functions/_tldr
/opt/homebrew/share/zsh/site-functions/_vifm
Run Code Online (Sandbox Code Playgroud)

更改模式没有任何作用,最终解决问题的方法是将每个问题文件和目录的所有权更改为 root:admin,如下所示:

sudo chown root:admin /opt/homebrew/share/zsh/site-functions/*
Run Code Online (Sandbox Code Playgroud)

最初,在问题出现之前,我的管理员用户拥有一切,因此所有权看起来像这样:usr :admin

这就是站点功能目录现在的样子,没有问题:

lrwxr-xr-x  1 root admin  30 Jul 19 19:41 _brew ->../../../completions/zsh/_brew
lrwxr-xr-x  1 root admin  79 Aug 10 20:26 _brew_services -> ../../../Library/Taps/homebrew/homebrew-services/completions/zsh/_brew_services
lrwxr-xr-x  1 root admin  59 Nov  6 16:28 _cargo -> ../../../Cellar/rust/1.56.1/share/zsh/site-functions/_cargo
lrwxr-xr-x  1 root admin  53 Dec  2 23:37 _gh -> ../../../Cellar/gh/2.3.0/share/zsh/site-functions/_gh
lrwxr-xr-x  1 root admin  56 Nov 30 15:21 _git -> ../../../Cellar/git/2.34.1/share/zsh/site-functions/_git
lrwxr-xr-x  1 root admin  61 Oct 13 11:12 _j -> ../../../Cellar/autojump/22.5.3_3/share/zsh/site-functions/_j
lrwxr-xr-x  1 root admin  50 Oct 23 18:52 _lf -> ../../../Cellar/lf/26/share/zsh/site-functions/_lf
lrwxr-xr-x  1 root admin  57 Nov  6 16:28 _task -> ../../../Cellar/task/2.6.1/share/zsh/site-functions/_task
lrwxr-xr-x  1 root admin  57 Nov 18 01:45 _tldr -> ../../../Cellar/tldr/1.4.2/share/zsh/site-functions/_tldr
lrwxr-xr-x  1 root admin  56 Oct 13 11:11 _vifm -> ../../../Cellar/vifm/0.12/share/zsh/site-functions/_vifm
Run Code Online (Sandbox Code Playgroud)


sul*_*rza 10

我的机器:

System Version: macOS 10.15.4 (19E287)
Kernel Version: Darwin 19.4.0
Run Code Online (Sandbox Code Playgroud)

所以这就是我所做的,

  1. 运行compaudit,它会给你一个它认为不安全的目录列表。

  2. 运行sudo chmod -R 755 target_directory (例如:sudo chmod -R 755 /usr/local/share/zsh

例子:

compaudit
Run Code Online (Sandbox Code Playgroud)

返回:

/usr/local/share/zsh

所以我跑

sudo chmod -R 755 /usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多链接


小智 10

以下工作于 M1

ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69

% compaudit
/opt/homebrew/share
Run Code Online (Sandbox Code Playgroud)

将组权限从 775 更改为 755

% sudo chmod 755 /opt/homebrew/share

drwxr-xr-x   33 xenea  admin   1056 Feb  2 01:28 share
Run Code Online (Sandbox Code Playgroud)


arg*_*lee 9

这两行对我来说是固定的。

sudo chown -R _user_:root /usr/local/share/zsh

sudo chown -R _user_:root /usr/local/share/zsh/*
Run Code Online (Sandbox Code Playgroud)

  • 为我工作!我在我的 PC 上使用网络帐户 - Ubutun 16.04 `sudo chown -R $(whoami):root /usr/local/share/zsh` `sudo chown -R $(whoami):root /usr/local/share/zsh /*` (3认同)

小智 9

我通过做修复了它

sudo chown -R root:staff /usr/local/share/zsh
Run Code Online (Sandbox Code Playgroud)

在我的情况下, share/ 中的其他目录也分配了“员工”组


Seb*_* H. 9

在 Mojave 上,这成功了: sudo chmod go-w /usr/local/share

  • 更好的是: `sudo chmod -R go-w /usr/local/share` (3认同)
  • 如果使用 zsh 补全: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh 表示 `chmod -R go-w "$(brew --prefix)/share"` (3认同)

Fra*_*nco 7

接受的答案对macOs Sierra(10.12.1)不起作用.不得不从/ usr/local递归

cd /usr/local
sudo chown -R <your-username>:<your-group-name> *
Run Code Online (Sandbox Code Playgroud)

注意:您可以随身携带您的用户名whoamiid -g

  • 我在Sierra上也没有这样做,尽管在多用户系统上正确的用户/组应该是root:staff (2认同)

Sha*_*nus 7

  1. 运行compaudit它会给你一个它认为不安全的目录列表

  2. sudo chown -R username:root target_directory

  3. sudo chmod -R 755 target_directory


kko*_*dev 5

在 macOS Sierra 上,您需要运行: sudo chown -R $(whoami):staff /usr/local


小智 5

我的建议是运行 compaudit,然后只修复审计发现的目录的权限。确保识别的目录没有组或其他的写权限。


Ray*_*Oei 5

我没有看到任何引用homebrew有关此主题的信息的答案:https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh

\n
\n

要使 Homebrew\xe2\x80\x99s 补全在 zsh 中可用,您必须在初始化 zsh\xe2\x80\x99s 补全工具之前在 FPATH 上获取 Homebrew 管理的 zsh 站点函数。将以下内容添加到您的 ~/.zshrc 文件中:

\n
\n
if type brew &>/dev/null; then\n  FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH\n\n  autoload -Uz compinit\n  compinit\nfi\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这必须在调用 compinit 之前完成。

\n
\n

without这解决了我手动更改所有权或其他方式的问题。

\n