在 WSL 下从 Windows 访问 root 用户目录?

在 WSL 下从 Windows 访问 root 用户目录?

我正在运行 WSL2、Ubuntu 20.04 和 Docker Desktop。我经常需要访问一些 root 拥有且我的主要用户无法读取的目录。总是必须这样做已经很过时了:

  • 以 root 身份手动登录 Ubuntu 控制台
  • 手动cd到我需要查看文件的目录
  • cat逐个文件

当必须在一两分钟内搜索大量目录时,这尤其痛苦,因为我现在必须对一堆 Portainer 目录进行搜索。

我希望能够单击 Explorer 或 Directory Opus 中的每个目录并在预览选项卡中查看。但是,使用 Windows 应用程序检查时显然无法访问这些文件/目录\\wsl$\Ubuntu\path\to\root\owned\directory\

Portainer 将其 WSL 文件夹创建为root。我可以手动将chown它们作为我的 WSL/Ubuntu 用户(同名:scott)然后能够执行上述操作,但这很快就会过时。我还担心将来它可能会在 Ubuntu/Portainer 端产生其他问题。

我想要将我的 Windows 用户添加到 Ubuntu,其中 Windows 资源管理器/Directory Opus/Notepad/等能够访问root用户文件/目录,但 Linux 是我的第二语言 ;-) 我不太清楚如何做到这一点。

此外,在 Windows 提示符中正确输入密码时,仍然失败:

网络凭证提示

PS:我确实知道我可以登录到 Ubuntu 控制台并执行操作explorer.exe .,但即便如此,在访问目录时我还是会收到错误root

答案1

正交答案(但很多比我的其他答案更简单):使用可以预览 root 拥有的文件的 Linux 应用程序,而不是使用 Windows 应用程序。缺点——当然,它与 Directory Opus 根本无法相比(IMHO)!

sudo apt install ranger
sudo ranger . # or the path you want to inspect

sudo请注意,出于安全原因,默认情况下禁用以as 运行时的文件预览。您可以通过 启用它zi。然后只需选择要预览的文件,它将显示在右栏中。

我假设您检查的主要是文本文件。如果文件长度超过终端高度,您可以滚动(参见键绑定)或使用 全屏分页器预览文件i

答案2

总结一下根本问题1,您的 Ubuntu 发行版可通过 Windows 中的 9P 网络共享访问。Windows 9P 客户端会自动创建\\wsl$\Ubuntu2 个(Windows 10) 或\\wsl.localhost\Ubuntu(Windows 11) 共享,它必须选择特定的 Ubuntu 用户才能提供访问/权限/所有权/等等。

1真的没有双关语的意思,我刚刚才注意到它!

2或者其他发行版名称,例如“Ubuntu-22.04”

WSL 使用默认用户root作为共享的“所有者”来分配。这就是为什么当 Windows 应用程序试图查看或编辑(例如)中的文件时,您通常无权访问受限制的文件\\wsl.localhost\Ubuntu

考虑到这一点(输入上述信息后),一个疯狂的想法浮现在我的脑海里。我们能用其他发行版,其中默认用户是root,启动 Windows 可执行文件,但仍然让它访问 Ubuntu 中的文件(仍然以 root 身份)?答案似乎是“是”,但我要说的是,这是一个我以前以为已经“解决”(或至少已经解决)的问题,结果却发现我错了。

因此,我在安装了旧版 WSL 的 Windows 10 和安装了最新版(截至昨天)WSL 的 Windows 11 上进行了测试0.70.8并且它似乎在这两种情况下都可以工作。不幸的是,这个过程有点复杂,但如果它对你有用,它应该是可以编写脚本或别名的东西。不要被下面的步骤数量吓到了。有几个原因导致它们比需要的要长:

  • 我解释事物时只是非常详细(或许过于详细)。
  • 我希望读完这篇文章后,你能理解为什么这有效(或无效),以便您将来能够根据您的用例调整流程(如果需要)。
  • 另外,下面的大部分步骤都是一次性设置并且不需要重复。

因此,要做到这一点,你需要一个分离发行版已安装。由于此发行版只需要能够以 root 身份启动 Windows 可执行文件,因此我们正在寻找最小的可用版本 - 那就是 Alpine Linux。我们可以让它变得更小,但这样做会得不偿失。您可以直接从 Microsoft Store 在 WSL 上安装 Alpine,就像安装 Ubuntu 一样。

  1. 首先前往 Microsoft Store,搜索“阿尔卑斯山 WSL”并安装它。

  2. 安装后,从商店中选择“打开”(或者直接从开始菜单运行 Alpine)。

  3. 系统询问时添加用户名和密码。为了验证后续步骤,只需使用与 Ubuntu 相同的用户名即可。

  4. su -并输入您上面使用的密码。

  5. echo -e "[user]\ndefault=root" > /etc/wsl.conf

  6. exit两次退出分发(第一次退出会话su,然后退出 Alpine)

  7. 回到 Ubuntu,运行以下命令选项1这个答案。如果您使用的是带有最新 WSL 版本的 Windows 11,则可能还需要使用选项 1.5。

  8. 退出 Ubuntu

  9. 以普通(非管理员)用户身份启动 PowerShell。

  10. wsl --shutdown

  11. wsl ~重启 Ubuntu

  12. 使用 PowerShell 打开另一个终端(仍为非管理员)并运行wsl ~ -d Alpine

  13. whoami确认您root默认以 Alpine 身份运行。如果不是,echo ... > wsl.conf则上述步骤中可能出现问题,我们需要进行故障排除。如果它以 身份运行root,请继续...

  14. ls /mnt/wsl/instances并确认那里有一个Ubuntu(或Ubuntu-20.04,等等)。

  15. 确保它包含 Ubuntu 发行版中的文件。例如(假设Ubuntu是发行版名称),ls /mnt/wsl/instances/Ubuntu/home/$USER/应显示与 Ubuntu 主目录中相同的文件。请注意,这仅在您在 Ubuntu 和 Alpine 中使用相同用户名时才有效。

    这是可行的,因为/mnt/wsl它是由 WSL 本身创建的挂载,并在您运行的所有 WSL2 实例/发行版之间共享。您放入的任何内容/mnt/wsl是:

    • 可从任何发行版获取
    • 短暂的,这意味着一旦 WSL 重新启动它就会消失。这不是问题,因为我们在这里放置的实际上是一个挂载中的挂载/。并且由于这/etc/fstab行,它实际上在每次 Ubuntu 启动时都会挂载。

    fstab我知道你对 Linux 还不熟悉,所以希望你明白!这确实包含了很多 Linux 概念( 、tmpfs、mounts 等)。

  16. 完成此操作后,退出 Alpine 并返回 Ubuntu:

    echo "Hello" > ~/testfile.txt`
    sudo chown root:root ~/testfile.txt
    sudo chmod 600 ~/testfile.txt
    

    ...创建一个我们可以用它来测试的文件。当然,我知道你已经有来自 Portainer 的类似文件,但这给了我一个我们可以可靠使用的路径。

    该文件将不再可在 Directory Opus 等中预览。您也无法通过 对其进行编辑notepad.exe testfile.txt

  17. 让我们看看是否可以使用 Alpine(我们已经确认root默认情况下运行)在记事本中打开和编辑文件,首先:

    wsl.exe \~ -d Alpine notepad.exe /mnt/wsl/instances/$WSL_DISTRO_NAME/home/$USER/testfile.txt
    

    如果一切正常(对我来说,在两个系统上都是如此),您应该能够在 Windows 记事本中编辑和保存该文件,即使它归所有者所有root并设置为 600(读写,仅所有者)权限。

  18. 如果可行,那么我们就有了一个可以使用的通用解决方案,然后可以针对其他用例进行调整。例如,尝试:

    # Pass the name of your Ubuntu distro into Alpine.
    # Not absolutely necessary, just a convenience.
    export WSL_USER_DISTRO=$WSL_DISTRO_NAME
    export WSLENV=$WSLENV:WSL_USER_DISTRO
    
    wsl.exe \~ -d Alpine
    # You are now in Alpine, running inside Ubuntu
    
    /path/to/dopus.exe /Go $(wslpath -w /mnt/wsl/instances/$WSL_USER_DISTRO/)
    

    您应该能够在 Directory Opus 中预览来自 Ubuntu 的 root 拥有/受保护的文件(至少在我这边经过测试并且可以正常工作)。

这是相当嵌套的,所以让我放松一下:

  • 我们在 PowerShell 中运行 Ubuntu
  • 我们wsl.exe在 Ubuntu 中运行(Windows 命令)来启动...
  • Ubuntu 中的 Alpine
  • 在 Alpine 中,我们可以通过(或类似方式)访问 Ubuntu 的所有文件(以 root 身份)/mnt/wsl/Ubuntu。并且 Alpine 的文件以 root 身份共享给 Windows(通过 9P)。
  • 在 Alpine 中,我们启动了 Directory Opus(Windows 二进制文件),它现在可以以 root 身份访问 Ubuntu 文件,因为我们正在访问它们通过高山。

有道理吗?如果没有,别担心,仅仅我感觉合理! ;-)。

虽然理论上你可以编写脚本或为其添加别名,但是当你将路径从 WSL 传递到 Windows,再传递到 WSL,再传递回 Windows 时,你 (非常/极其/几乎肯定/99.99999%) 很可能会遇到一些引用/转义问题。

因此,如果工作流程适合您,我只需启动 Alpine 并使用启动您想要以 root 身份访问的任何 Windows 可执行文件。

相关内容