Linux
文件的意外訪問權限
我在 windows 中使用 linux 作為子系統。
通過 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 時它可以正常工作
有關 Windows 驅動器和 WSL 之間的權限映射方式的資訊,請參閱此 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 實例
然後,您應該會發現 a
touch
結果為.rw-r--r--
,並且您的程式碼結果為預期的.rwxr-x---
(750)。至少在我的 WSL2 / Ubuntu 20.04 實例上測試並確認(包括您的測試應用程序)。
另請注意,與 WSL1 相比,Windows 驅動器上的 WSL2 性能非常糟糕。如果您要在該驅動器上執行任何文件密集型操作,請盡可能使用 WSL1 實例。或者只是堅持 WSL2 上的 ext4 fs。