文件的意外访问权限

文件的意外访问权限

我使用 linux 作为 windows 中的子系统。

我在通过 bash 终端创建文件时确实遇到问题。如果我运行命令touch foo.txt然后ls -l foo.txt。所有访问权限将被激活且无法更改。

-rwxrwxrwx foo.txt

有解决办法吗?

还尝试编写一个 C 程序来创建具有 0750 权限的文件,但仍然存在同样的问题:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {
  umask(0);
  int fd = open("foo.txt", O_RDONLY | O_CREAT | O_EXCL, 0750);
  if(fd < 0) perror("foo.txt");
  close(fd);
}

编译程序后:

-rwxrwxrwx foo.txt

顺便说一句,在虚拟机上使用 linux 时它可以正常工作

答案1

这个 WSL 文档有关如何在 Windows 驱动器和 WSL 之间映射权限的信息。默认情况下,您将看到该文件的 Windows 权限,并且 chmod 确实没有太大作用。

但驱动器通过元数据支持进行安装,然后 WSL 将应用在元数据中找到的权限而不是 Windows 权限。这允许 WSL 将 Linux 权限映射到 Windows 驱动器上的文件。

要自动安装具有元数据支持的 Windows 驱动器:

  • /etc/wsl.conf在您的 WSL 实例中编辑或创建
  • 添加以下行:
    [automount]
    enabled = true
    options = "metadata,umask=22,fmask=11"
    
  • 退出您的 WSL 实例
  • wsl --terminate <distroname>使用PowerShell 或 cmd终止 WSL 实例。
  • 重新启动 WSL 实例

然后您应该发现 atouch结果为.rw-r--r--,并且您的代码结果为预期的.rwxr-x---(750)。

至少在我的 WSL2 / Ubuntu 20.04 实例上进行了测试和确认(包括您的测试应用程序)。

另请注意,与 WSL1 相比,WSL2 在 Windows 驱动器上的性能确实很糟糕。如果您要在该驱动器上执行任何文件密集型操作,请尽可能使用 WSL1 实例。或者只使用 WSL2 上的 ext4 fs。

相关内容