WSL 是 windows 10 下的一个 Linux 子系统,我们通常在 WIN + R 中使用 bashubuntu(对应系统名称)登陆这个子系统,但我想用 root 账号去做一些事情时,对于 su root 我并不知道正确的密码。 当时我是为了解决某个家伙(就是你,Ruby Gem!)反复提示的权限警告,按照惯例,我修改了 /etc/sudoers 文件,并强制覆盖保存,随后我的 sudo 命令再也不能使用,在修复这个问题时,我发现了在 WSL 中 root 账号的秘密。

WSL 简介

关于 WSL 的有关内容,请参考我在简书上的博客:WSL

遇到的问题

当我使用 sudo 作为相关命令的前缀时,我遇到的这个错误:

>>> /etc/sudoers: syntax error near line 30 <<<
sudo: parse error in /etc/sudoers near line 30
sudo: no valid sudoers sources found, quitting
sudo: unable to initialize policy plugin

于是我想查看 /etc/sudoers 文件的第 30 行内容:

cat sudoers

提示我权限不足:

cat: sudoers: Permission denied

按照正常逻辑,加上 sudo 前缀,又回到了最初的错误。

在正常的 Ubuntu 系统中,对于 /etc/sudoers 的错误,通过以下命令解决:

cd /etc
pkexec visudo

但是我这个是 WSL 环境,在运行上面的解决方案时,出现提示:

Error getting authority: Error initializing authority: Could not connect: No such file or directory

于是我不得不去求助搜索引擎,经过查阅得知,对于 WSL 而言,可以在 CMD 或者 Windows PowerShell 中使用以下命令登陆 root 账号:

wsl -u root

参考:sudoers-file-syntax-error-on-wsl

随后修复 /etc/sudoers 文件的第 30 行内容,再测试 sudo 命令:

sudo apt update

一切都回归正常。

举一反三

我忽然想到这是 WSL,对于修改文件这种事情,Windows 用户是最有权限的,而我只需要找到 WSL 的路径即可。

WSL 的根目录路径通常位于:

C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_<systemname>\LocalState\rootfs

随后使用记事本打开 etc 目录下的 sudoers 文件,修改后保存,再进入 WSL 查看,保存成功!

总结

果然换个思路,解决问题的办法就会简单很多,但搜索引擎告诉我的方法更有价值,因为我一直想 su root 而得不到解决办法,没想到今天发现了秘密。