在 Linux 的 Windows 子系统上,ls /usr/bin 的权限被拒绝

在 Linux 的 Windows 子系统上,ls /usr/bin 的权限被拒绝

ls /usr/bin

给出错误信息:

ls: reading directory '/usr/bin': Permission denied

。因此wbash.exe,bash-completion 和 eshell-completion 会失败或给出不完整的结果。我希望它能正常工作。

确实有效的方法:

/usr/bin $ ls -l emacs
lrwxrwxrwx   1 root           root           23 2017-07-31 17:16 emacs -> /etc/alternatives/emacs
/usr/bin $ ls -l gcc-5
-rwxr-xr-x   1 root           root       915736 2017-09-14 06:01 gcc-5
/usr/bin $ ls -ld /usr/bin
drwxr-xr-x   0 root           root          512 2017-12-19 09:45 /usr/bin
/usr/bin $ ls -ld /usr/sbin
drwxr-xr-x   0 root           root          512 2017-12-19 09:45 /usr/sbin
/usr/bin $ ls -ld /
drwxr-xr-x   0 root           root          512 2017-11-17 10:23 /
/usr/bin $ ls -ld /usr
drwxr-xr-x   0 root           root          512 2017-03-30 11:55 /usr

Windows 版本为:Windows 10(64 位),版本 1703(内部版本 15063.786)

sbin可以毫无问题地列出目录,并且通过 WindowsExplorer 可用的所有窗口设置与bin%USERPROFILE%\AppData\Local\lxss\rootfs\usr相同sbin

命令icacls.exe binicacls.exe sbin给出%USERPROFILE%\AppData\Local\lxss\rootfs\usr的答案完全相同(直到第一个单词binforbinsbinfor sbin)。因此它似乎与额外属性无关。此外,命令icacls.exe bin /verifyicacls.exe sbin /verify不指示任何错误。

ubuntu 是否有一些与安全相关的功能(我不知道)禁止我列出 的目录内容/usr/bin?(在这种情况下,如果它不禁止列出 ,那就很奇怪了/usr/sbin。)

答案1

这看起来很像是权限问题。

由于您已验证问题不在于 Windows,因此该问题在于 WSL 内部设置,它模拟了 Windows 上本身不存在的 Linux 权限。

我不知道 WSL 究竟是如何模拟 Linux 权限的。如果它使用 Windows 的 ACL 机制,你可以通过以下方式重置它们:

icacls %localappdata%\lxss /reset /T /C

如果这没有帮助,并且不更好地了解如何实现这些权限,我建议重新安装 WSL:

  1. 备份您的数据

  2. 卸载 Ubuntu 环境但保留主文件夹,然后使用以下命令重新安装 WSL:

    lxrun /uninstall
    lxrun /install
    
  3. 如果这没有帮助,请通过输入以下命令完全重新安装 Ubuntu 环境,包括删除主文件夹:

    lxrun /uninstall /full
    lxrun /install
    

在上述两个命令之间,检查文件夹 %localappdata%\lxss是否为空。如果不是,请将其内容移动到临时存储中,并在不再需要时删除。

答案2

在 cygwin 下没有权限问题$HOME/AppData/Local/lxss/rootfs/usr/bin,并且我在 cygwin 下对 wsl 的 Playground 文件夹进行了一些测试。这让我找到了以下解决方案。

在 cygwin 的 bash 中我进入$HOME/AppData/Local/lxss/rootfs/usr并运行以下命令:

find bin -mindepth 1 -maxdepth 1 -printf "cp -a %p fix/%p\n" > /temp/fix.sh

这会在 cygwin 和 wsl 通过符号链接共享的/temp/fix.sh文件夹中创建了一个脚本。/temp

wbash进入/usr/,创建文件夹fixfix/bin,运行脚本,然后将目录移动fix/binbin-fix

cd /usr
mkdir -p fix/bin
. /temp/fix.sh
mv fix/bin bin-fix

因此,wbash它告诉我它有权限问题。好的,我接受了这一点,并作为此过程的最后一步bin/head重新安装(见下文)。接下来,我关闭了所有应用程序和它本身,然后返回到 cygwin,文件夹仍然打开。coreutilswbashwbashusr

我移开了那里bin并将其重新命名bin-fixbin

mv bin bin.old
mv bin-fix bin

我重新启动wbash后,一切运行正常ls /usr/bin

coreutils正如我上面提到的,我最后一步重新安装了:

sudo aptitude reinstall coreutils

相关内容