我正在运行 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$\Ubuntu
2 个(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 一样。
首先前往 Microsoft Store,搜索“阿尔卑斯山 WSL”并安装它。
安装后,从商店中选择“打开”(或者直接从开始菜单运行 Alpine)。
系统询问时添加用户名和密码。为了验证后续步骤,只需使用与 Ubuntu 相同的用户名即可。
su -
并输入您上面使用的密码。echo -e "[user]\ndefault=root" > /etc/wsl.conf
exit
两次退出分发(第一次退出会话su
,然后退出 Alpine)回到 Ubuntu,运行以下命令选项1的这个答案。如果您使用的是带有最新 WSL 版本的 Windows 11,则可能还需要使用选项 1.5。
退出 Ubuntu
以普通(非管理员)用户身份启动 PowerShell。
wsl --shutdown
wsl ~
重启 Ubuntu使用 PowerShell 打开另一个终端(仍为非管理员)并运行
wsl ~ -d Alpine
whoami
确认您root
默认以 Alpine 身份运行。如果不是,echo ... > wsl.conf
则上述步骤中可能出现问题,我们需要进行故障排除。如果它以 身份运行root
,请继续...ls /mnt/wsl/instances
并确认那里有一个Ubuntu
(或Ubuntu-20.04
,等等)。确保它包含 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 等)。完成此操作后,退出 Alpine 并返回 Ubuntu:
echo "Hello" > ~/testfile.txt` sudo chown root:root ~/testfile.txt sudo chmod 600 ~/testfile.txt
...创建一个我们可以用它来测试的文件。当然,我知道你已经有来自 Portainer 的类似文件,但这给了我一个我们可以可靠使用的路径。
该文件将不再可在 Directory Opus 等中预览。您也无法通过 对其进行编辑
notepad.exe testfile.txt
。让我们看看是否可以使用 Alpine(我们已经确认
root
默认情况下运行)在记事本中打开和编辑文件,首先:wsl.exe \~ -d Alpine notepad.exe /mnt/wsl/instances/$WSL_DISTRO_NAME/home/$USER/testfile.txt
如果一切正常(对我来说,在两个系统上都是如此),您应该能够在 Windows 记事本中编辑和保存该文件,即使它归所有者所有
root
并设置为 600(读写,仅所有者)权限。如果可行,那么我们就有了一个可以使用的通用解决方案,然后可以针对其他用例进行调整。例如,尝试:
# 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 可执行文件。