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 

这对我来说是固定的:

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

信用: zsh邮件列表上的一篇文章


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

 $ sudo chown -R root:root ./site-functions 

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

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

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

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

 compaudit | xargs chmod gw 

将做的伎俩,见http://www.wezm.net/technical/2008/09/zsh-cygwin-and-insecure-directories/

当我sudo -i启动一个root shell的时候,我得到了相同的警告,@ chakrit的解决scheme对我不起作用。

但是我发现compinit -u开关工作,例如在你的.zshrc / zshenv或​​者你调用compinit

 compinit -u 

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

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

大多数答案都带有一个解决scheme,但是不要提到为什么会出现这个警告。 这里是ZSH的compinit的摘录:

出于安全原因,compinit还会检查完成系统是否使用非root用户当前用户所拥有的 文件 ,或者全局或组可写目录中的文件 ,或者非root用户当前用户拥有的 文件 。 如果find这样的文件或目录,compinit会询问是否应该使用完成系统。 为了避免这些testing,并使所有find的文件都不用问,就使用选项-u,并使compinit静默地忽略所有不安全的文件和目录,使用选项-i。 这个安全检查在给出-C选项时完全跳过。

因此,解决scheme意味着修复以下一项(或全部):

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

     compaudit | xargs chown -R "$(whoami)" 
  • 删除原因组中的文件/其他人的写入权限:

     compaudit | xargs chmod go-w 

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

 compinit -u 

但我并不真正暗示这一点,因为隐藏地毯下的问题只能在短期内解决问题。

接受的答案在macOs Sierra(10.12.1)上不适用于我。 必须从/ usr / local进行recursion

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

注意:您可以通过使用id -g来获取whoami和您的用户名

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

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

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