我使用 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。