zsh compinit:不安全目录

这是什么意思,我该如何修复它?

zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?

运行compaudit返回以下内容:

There are insecure directories:
/usr/local/share/zsh/site-functions
289047 次浏览

备注:这个答案来自2012年。


这对我来说是固定的:

$ sudo chmod -R 755 /usr/local/share/zsh/site-functions

图片来源:zsh邮件列表上的帖子


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

$ sudo chown -R root:root /usr/local/share/zsh/site-functions

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

编辑2:在OSX 10.11上,只有这个工作:

$ sudo chmod -R 755 /usr/local/share/zsh
$ sudo chown -R root:staff /usr/local/share/zsh

用户:员工是OSX上正确的默认权限。

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

但是我发现compinit-u开关可以工作,例如在你的. zshenv/zshenv或你叫compinit的地方

compinit -u

注:不推荐用于生产系统

请参阅http://zsh.sourceforge.net/Doc/Release/Completion-System.html#Initialization

删除组写入权限

compaudit | xargs chmod g-w

会做的把戏。

查看http://www.wezm.net/technical/2008/09/zsh-cygwin-and-insecure-directories/

接受的答案对我在macOS Sierra(10.12.1)上不起作用。不得不从 /usr/local递归

cd /usr/local
sudo chown -R <your-username>:<your-group-name> *

备注:您可以使用whoami获取您的用户名,使用id -g获取您的组

这两条线对我来说是固定的。

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


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

大多数答案都有解决方案,但没有提到为什么会出现此警告。以下是ZSHcominit的摘录:

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

因此,解决方案意味着解决以下一个(或所有)问题:

  • 将当前用户设置为原因中所有目录/子目录/文件的所有者:

    compaudit | xargs chown -R "$(whoami)"
    
  • removing write permissions for group/others for the files in cause:

    compaudit | xargs chmod go-w
    

Another approach would be to skip these checks by using

compinit -u

但我并不是真的建议这样做,因为把问题藏在地毯下只能在短期内解决问题。

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

我通过做

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

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

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

删除组写访问权限:

sudo chmod g-w /usr/local/share/zsh/site-functions
sudo chmod g-w /usr/local/share/zsh

最好将更改限制为zsh目录。

在Mojave上,这确实奏效了: sudo chmod go-w /usr/local/share

【2022年更新】

如果使用ZSH Completions,您应该使用chmod -R go-w "$(brew --prefix)/share"

今天早上,我系统中的一些软件包更新了,并给我留下了这条错误消息。我使用的是Ubuntu 18.04。

显然,更新中的某些内容将用户名和组更改为数字,而不是root,如下所示:

# There are insecure files: /usr/share/zsh/vendor-completions/_code
# sudo ls -alh
-rw-r--r-- 1  131  142 2.6K 2019-10-10 16:28 _code

我只是将此文件的用户和组更改回root,问题就消失了。我确实没有需要更改任何权限,除非了解问题的根本原因,否则会警告不要这样做。

sudo chown root _code && sudo chgrp root _code

131142切换回root后,来自zsh的此错误消息消失了。

列出的解决方案都不适合我。相反,我最终卸载并重新安装了Homebrew,这起到了作用。卸载说明可以在这里找到:http://osxdaily.com/2018/08/12/how-uninstall-homebrew-mac/

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

  2. sudo chown -R username:root target_directory

  3. sudo chmod -R 755 target_directory

我的建议是运行com的审计,然后只修复审计找到的目录的权限。 确保已识别的目录没有组或其他的写入权限。

这是https://github.com/zsh-users/zsh-completions/issues/433#issuecomment-600582607唯一对我有用的东西。谢谢https://github.com/malaquiasdev

  $ cd /usr/local/share/
$ sudo chmod -R 755 zsh
$ sudo chown -R root:staff zsh

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

ZSH_DISABLE_COMPFIX=true

在我的mac OS Catalina上运行此命令对我有用:

compaudit | xargs chmod g-w,o-w

我的机器:

System Version: macOS 10.15.4 (19E287)
Kernel Version: Darwin 19.4.0

这就是我所做的,

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

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

例子:

compaudit

退货:

/usr/local/share/zsh

所以我跑

sudo chmod -R 755 /usr/local/share/zsh

阅读更多链接

MAC OS X解决方案:

$ sudo chmod -R 755 /usr/local/share/zsh
$ sudo chown -R root:staff /usr/local/share/zsh

此外,“user:人员=OSX上的默认根用户。

我在运行google-cloud-sdk安装脚本后遇到了这个问题,该脚本通过.zshrc中的条目将命令完成添加到shell中。

以下Homebrew在zsh中配置完井的说明很有帮助。

此外,如果您在尝试加载这些完成时收到“zsh compinit:不安全目录”警告,您可能需要运行以下命令:chmod -R go-w "$(brew --prefix)/share"

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

第一轮:

compinit

使用compaudit如果上面不起作用

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

sudo chown $(whoami) PATH_HERE


sudo chmod -R 755 PATH_HERE

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

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


sudo chmod -R 755 /usr/local/share/zsh

一旦你找到了理解的原因,解决方案就是琐碎明确

  • 原因compaudit输出的目录具有其他(全域可写)的权限;或者这些文件由root或您自己以外的其他人拥有。

  • 示例:在我的情况下,compaudit给了我:

% compaudit
There are insecure directories:
/usr/local/share/zsh/site-functions
/usr/local/share/zsh

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

% 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

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

  • 解决方案:关闭可写分组权限!
% chmod g-w /usr/local/share/zsh
% chmod g-w /usr/local/share/zsh/site-functions

就是它了!你可以走了。打开一个新终端,你应该没有不再看到“zsh compinit: insecure directories”消息;)

使用compinity字符发送到脚本的输入流,以便自动回答忽略不安全的目录和文件并继续[y]或中止cominit[n]?问题

echo "y" > source <GOOGLECLOUDSDK>/completion.zsh.inc

解决方案在以下情况下有用

  • 无法更改所有权/访问权限到文件夹
  • 当您不能使用-u选项删除警告时(可能是因为您自己没有显式调用'compinit',而是由您调用的脚本调用)

备注:它不解决问题,只隐藏警告(与此处涉及删除“组写入权限”或“将所有权更改为root”的其他答案相反)。

在M1工作

ProductName:    macOS
ProductVersion: 11.1
BuildVersion:   20C69


% compaudit
/opt/homebrew/share

将组权限从775更改为755

% sudo chmod 755 /opt/homebrew/share


drwxr-xr-x   33 xenea  admin   1056 Feb  2 01:28 share

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

compaudit | xargs chmod g-w

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

(在macOS BigSur上测试)

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

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

if type brew &>/dev/null; then
FPATH=$(brew --prefix)/share/zsh/site-functions:$FPATH


autoload -Uz compinit
compinit
fi

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

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

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

CLI# compaudit
There are insecure directories:
/usr/local/share/zsh
CLI# sudo chmod -R 755 /usr/local/share/zsh
Password:

我尝试了所有发布的解决方案,最终没有一个适用于我的特定案例。然而,我要感谢那些向我指出所有权是多帐户真正问题的用户,而不是模式。 我将这个答案发布给其他有类似设置的人(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

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

sudo chown root:admin /opt/homebrew/share/zsh/site-functions/*

最初,在问题出现之前,我的管理员用户拥有一切,所有权因此看起来像这样: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