在Ubuntu / Linux中重置密码,在Windows的Bash中

我在Windows 10上安装了Linux Bash(可从Microsoft获取),但是我忘记了我的密码。
我已经搜索了解决方案,但我只找到一些建议,这些建议涉及在系统启动之前进行某些操作,比如访问恢复模式,但在这种情况下这将不起作用,因为这个Ubuntu只是Windows系统中的一个应用程序,没有自己的引导过程。
我该如何重置我的密码?

5你确切失去了哪个密码?你的Windows帐户密码吗? - David Foerster
一个示例的“启动选项”是通过在grub中设置内核命令行为“single”,以单用户模式启动。对于那些好奇的人来说。 - Kevin
7个回答

  • 运行bash并记下您的Linux用户名(这不需要与您的Windows用户名匹配),请参见如何找到我的用户名?
  • 关闭正在运行的Ubuntu上的Bash(否则下一个命令将失败)。
  • 在Windows管理员命令提示符(Super+XA)中将默认用户更改为root:

    ubuntu config --default-user root
    
如果您在WSL中使用Ubuntu 18.04,命令已更改为ubuntu1804
ubuntu1804 config --default-user root

现在,在Windows上的Ubuntu Bash登录时,无需输入密码即可以root用户身份登录。 在Bash中使用passwd命令来更改用户密码(要重置密码的用户):
passwd your_username
在Windows命令提示符中将默认用户更改回您的普通用户:
ubuntu config --default-user your_username

如果您在WSL中使用的是Ubuntu 18.04,命令已更改为ubuntu1804

ubuntu1804 config --default-user your_username

观看完整视频以恢复您的密码Windows子系统Linux https://youtu.be/dTR232yvDCE 注意1:视频中使用的子系统不是Ubuntu,而是Kali Linux。因此命令有所不同。
注意2:如果您仍在使用随Anniversary Update提供的原始Ubuntu子系统,请使用命令lxrun。建议升级到通过Microsoft Store分发的子系统版本。

7lxrun适用于WSL的Beta版本。如果你从应用商店安装Ubuntu,命令是ubuntu config --default-user root - Endy Tjahjono
2是的,这是一种替代的方法,但是我遇到了错误:无法将默认用户设置为:root - Kirby
3@Kirby:在运行Windows命令提示符中的命令之前,你必须先从WSL shell注销。 - dr_
我尝试了"ubuntu config --default-user root",但是出现了一个错误,提示说"ubuntu不被识别为内部或外部命令,可执行程序或批处理文件"。 - Indominus
1我一直收到“错误:0x80070057 参数不正确”的提示,所以最后我按照@dr01的提示,在PowerShell中运行了ubuntu,然后logout,再重新配置默认用户。成功了。 - nikodaemus
4如果你在WSL上安装了Ubuntu 18.04,命令应该是ubuntu1804而不是ubuntu。希望这能避免一些困惑。 - Indominus
@Indominus - 我已经更新了答案,加入了这些信息。 - Panther
我试了一下这个指南,但是根本不起作用,你能帮我看看吗? Imgur - Luke
1对我来说,我使用lxrun /setdefaultuser root命令来设置默认用户。 - Nick Ellis
请注意,这个回答中的“Ubuntu”是指您想要配置的发行版。例如,它也可以是“Suse”或“Debian”。 - Paul
1请注意,在配置生效之前,您需要关闭所有打开的 WSL shells。 - Paul
1不需要以管理员身份运行Windows命令提示符。普通用户权限也可以正常工作(因为每个WSL实例是特定用户的本地实例,而非系统范围)。 - Bob
@Bob,我的经验也是如此,只需运行常规命令提示符即可正常工作。 - james-see
1如果您使用的是Ubuntu 20.04,请使用ubuntu2004 - user2233706
一直收到“错误:0x80070057 参数不正确”的提示,这个解决方案对我没有起作用。 - Bishoy

微软在这个问题上有一个很好的帮助页面:WSL用户文档

在Windows PowerShell(Super+Xi)中,您可以使用以下命令登录到Ubuntu的root账户:

wsl --user root

然后按照通常的方式更改密码,即对当前用户(即root)使用以下命令:
passwd

或者为另一个用户使用

passwd username

这个交互式地要求您输入一个新密码(两次)。不需要Windows管理员权限。

如果您在WSL中安装了多个发行版,那么您可以使用以下命令列出已安装的发行版的名称:

wsl -l

然后使用发行版的名称来指定您要登录到哪个发行版,例如要登录到Ubuntu 20.04:
wsl -d Ubuntu-20.04 --user root

3太棒了!这个方法从2019年10月开始就有效。而且,非常重要的是,这个提示命令甚至在Windows机器上没有管理员权限时也可以使用(如果你在公司的电脑上,这将节省时间和金钱)。 - Damien Pirsy
1更改根密码 - 是的,在Windows下启动Ubuntu后,在控制台中键入: $ su root

passwd YOUR_ACCOUNT_NAME

- dawciobiel
因为我不知道旧密码,所以在虚拟机上无法工作。 - Gringo Suave
1@GringoSuave 当你是root用户时,系统不会要求输入密码。你是跳过了第一步还是在中间添加了额外的步骤? - Nobody
4是的,我搞定了。我必须使用“passwd user”。谢谢。 - Gringo Suave
它有效。谢谢。 - Basi
这就是我一直在寻找的。感谢你提供这个棒极了的答案。 - Sunny Prakash
这似乎也是Microsoft推荐的方式,供您参考。 - a11
@a11 谢谢你的提示。 - Nobody
这解决了EG的笔记本电脑问题。谢谢。 - daparic

重要 此答案仅适用于旧版WSL1,已过时,因为它引用了WSL1不再使用的路径,并且最重要的是可能会导致文件系统损坏,请参考微软。请在此处查看其他正确的更改密码方法。

上述方法未奏效。即使更改了默认用户,Bash仍然以我的用户身份打开。

所以我尝试了以下方法,成功了:

编辑此文件(在记事本或Notepad++中):
%localappdata%\lxss\rootfs\etc\shadow
找到您的普通用户,例如: user1:$jsdjksadgfhsdf.saflsdf.sadf.safd:17299:0:99999:7:::
只需删除哈希部分(下面的部分)即可。
    $jsdjksadgfhsdf.saflsdf.sadf.safd

你会看到一个不同的哈希值 - 希望如此 :) 所以它应该是这样的:
    user1::17299:0:99999:7:::

3. 保存文件 4. 以 root 权限再次启动 Bash,并设置您的密码 sudo bash passwd 现在您可以设置一个新密码,而无需输入先前的密码。

16这个可以运作,但官方目录现在类似于%localappdata%\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\etc\shadow - Mauro Destro
14这绝对是最好的答案。要找到shadow文件的路径,你可以使用这个PowerShell怪物:Get-ChildItem -Path C:\ -Filter shadow -Recurse -ErrorAction SilentlyContinue -Force,这是一个非常冗长的版本,执行和结果都是find /mnt/c/ -name shadow。编辑文件不需要提升权限,但在编辑之前确保关闭你的bash窗口。 - Russ
2这是赢家!当第一个答案不起作用时,它表现得非常出色。 - Kim
1被接受的答案给了我一个错误提示:'错误:0x80070057 参数不正确。'(不,控制台没有处于传统模式)。这个方法完美地解决了问题; - Cristian Diaconescu
尝试找到lxss,但它显示“Windows无法找到'C:\Users\longnx\AppData\Local\lxss'。请检查拼写并重试。” - Luke
@Russ,为什么要嘲笑PS的冗长(有意思的双关)?;-) 我要补充一下给新手们,你应该在你的find命令中加入2>/dev/null,因为你忽略了PS命令中的错误。一个更公平的比较可能是:为了更简洁,忽略错误并且(额外加分!)将PS的输出改成类似于find的输出(不用借助awk!),我会提供find /mnt/c/ -name shadow 2>/dev/nulldir c:\shadow -rec -ea si | select FullName的对比。话虽如此,我通常在每个shell中使用长参数形式,因为制表符补全已经解决了大部分难题。不过,非常好的评论。 - chris
1这个答案完全按照上面的描述起作用了。第一个答案对我没用。 - Shanemeister
你的解决方案对我很有效。非常感谢你。 - TommyDo
注意:这里的rootfs文件夹指的是安装目录或WSL。 - Harshiv
这在WSL2上行不通,因为Linux文件系统现在是一个VHDX镜像。 - Tilman

编辑 如果您安装了WSL的商店分发版本,则此方法不再适用。

补充Tmu的答案,这里有一个Powershell脚本(gist),可以自动化该过程(包括自动检测当前默认用户名)。

# Resets the password for the default LXSS / WSL bash user
$lxssUsername = (Get-ItemProperty HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss).DefaultUsername
lxrun /setdefaultuser root
bash -c "passwd $lxssUsername"
lxrun /setdefaultuser $lxssUsername

在PowerShell中出现错误:0x80070002 - Nitin Sawant

我也需要在我的Windows 10中重置密码,我有WLS 1。
1- 检查你的Linux/Ubuntu名称,列出文件夹:
%userprofile%\AppData\Local\Microsoft\WindowsApps

在我的情况下,我找到了Ubuntu1604.exe,所以下一步我将使用ubuntu1604作为名称。 list files in: %userprofile%\AppData\Local\Microsoft\WindowsApps 2- 以管理员权限打开CMD并运行(你将不会得到任何返回结果):
ubuntu1604 config --default-user root

3- 启动你的WSL,检查是否获得了root权限或者运行whoami命令(你需要是root用户)并使用以下命令更改你的密码:
passwd [your-linux-username]

关闭你的WSL并返回CMD窗口,将默认的Linux用户名设置回去。
ubuntu1604 config --default-user [your-linux-username]

5- 重新启动你的WSL/Ubuntu/另一个Linux,检查并享受吧。

这里的其他答案大多是有效的,但过于复杂了。要在任何WSL发行版中更改用户密码,只需简单地执行以下步骤:
从Ubuntu(或其他发行版)内部操作:
wsl.exe \~ -u root -d $WSL_DISTRO_NAME -e passwd $USER

*需要启用WSL互操作性。

或者从PowerShell或CMD(作为一个“普通”的非管理员用户):

wsl ~ -u root -e passwd <username>
# Add the -d <distro_name> if not using the default distro

*不需要WSL互操作。


对于那些忘记了 root 密码的人,我找到的解决方法是通过 Windows Store 更新到 Ubuntu 18.04 LTS。请注意,Windows Store 有两个不同的选项:
1. Ubuntu 2. Ubuntu 18.04 LTS(选择这个)
要检查当前版本,请以任何用户身份运行以下命令:
在命令提示符下输入:
cat /etc/*release

你应该在输出中看到一行文字,上面写着:
DISTRIB_RELEASE=16.01

如果你看到这个,那肯定是要更新到18.04,然后它会提示你创建新的UNIX凭据。