如何从 Windows 10 设置“WSL”密码?

如何从 Windows 10 设置“WSL”密码?

设想

使用命令自动安装适用于 Linux Ubuntu 16.04 的 Windows 子系统全新安装后:

lxrun /install /y
lxrun /setdefaultuser exampleUsername /y

新安装的用户名是:exampleUsername。接下来,如果想要以sudo特权执行命令,例如 yes | sudo apt update,系统会提示输入exampleUsername两次密码。

问题

如何使用脚本从 Windows 10 设置有密码的用户密码?

尝试

  1. 创建密码更改 powershell.ps1文件,内容如下:
wsl passwd
wsl testPassword
wsl testPassword

但它在执行时仍然会返回手动输入密码的提示:

PS C:\twInstall> ./pw.ps1 更改 exampleUser 的密码。(当前) UNIX 密码:

  1. 尝试将密码两次通过管道传输到 passwd 命令,pw.ps1内容如下:
wsl testPassword testPassword | passwd

返回错误:

passwd:术语“passwd”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试。位于 C:\twInstall\pw.ps1:1 char:25

  • wsl 测试测试 测试测试 | passwd
  •                     ~~~~~~
    
    • CategoryInfo:ObjectNotFound:(密码:字符串)[],CommandNotFoundException
    • 完全合格错误标识:CommandNotFoundException

评论反馈适配

目前,脚本在 Windows 10 Pro N 64 位(桌面版)、版本 1709、内部版本 16299.192 上运行WSL Ubuntu 16.04.2 LTS

  1. 基于@harrymc 建议的答案

3.1 首先使用命令将默认用户设置为root:

lxrun /setdefaultuser root /y

3.2 然后使用命令创建另一个用户(通过将其设置为默认用户):

lxrun /setdefaultuser testuser /y

3.3 以该用户身份运行命令,以防万一需要在 wsl 中初始化任何内容来创建用户:

wsl echo "hello world"

3.4 使用命令切换回root用户:

lxrun /setdefaultuser root /y

3.5 然后设置 passwd 文件的路径(手动检查发现它位于:/etc/passwd因此:

wsl set path /etc/passwd

3.6然后使用命令更改非root用户的密码:

wsl echo 'testusername:newpasswd' | chpasswd

返回:

‘chpasswd’ 不被识别为内部或外部命令、可运行程序或批处理文件。

3.7 使用 sudo 重试出现同样的错误:

wsl sudo echo 'testusername:newpasswd' | chpasswd

返回:

‘chpasswd’ 不被识别为内部或外部命令、可运行程序或批处理文件。

3.8 由于有人担心 wsl Ubuntu 16.04.2 LTS 是否具有 chpassword 功能,因此我随后在 wsl 中手动尝试了该功能,使用命令时没有出现任何错误:

echo 'testusername:newpasswd' | chpasswd

3.9 显然,在转换过程中出现了错误:

echo 'testusername:newpasswd' | chpasswd

到:

wsl echo 'testusername:newpasswd' | chpasswd

我怀疑这是由于从 cmd 或 powershell 运行 wsl 命令时管道工作方式出现错误。

答案1

从命令行运行 WSL 不会创建登录 shell。具体来说,PATH 未设置,因为 WSL 从 Windows 父 CMD 继承了 PATH 环境变量。

您需要准确指定文件的路径passwd,可能是 /usr/bin/passwd(但我没有使用这个旧产品)。

另外要说的是,该命令testPassword testPassword | passwd不会传递包含testPassword和的两行testPassword,但我不认为这是必需的。

密码 命令更好(如果在 WSL 中可用):

echo 'userid:newpasswd' | chpasswd

记得添加完整路径,这可能需要一些sudo魔法。

答案2

这些不一定是最小步骤,但它们在以下系统类型中得到了验证:10 Pro N 64 位(桌面版),版本 1709,构建 16299.192,带有 WSL Ubuntu 16.04.2 LTS,来源这里

在 Windows 功能中启用“WSL”并重新启动后:

  1. 首先使用命令将默认用户设置为root:
lxrun /setdefaultuser root /y
  1. 然后使用命令创建另一个用户(通过将其设置为默认用户):
lxrun /setdefaultuser testusername /y
  1. 使用命令切换回root用户:
lxrun /setdefaultuser root /y
  1. 然后使用命令更改非root用户的密码:
bash -c "echo 'testusername:mypassword' | chpasswd"

看起来是相同的命令,由@harrymc 给出wsl在它前面不能与 一起使用,但可以与 一起使用bash -c

  1. 验证:首先在命令提示符窗口中实际打开 WSL:
wsl su testusername
  1. 然后执行一个需要输入用户名密码的命令testusername::
su testusername

返回错误的密码:

testusername@DESKTOP-SomeDesktop:/mnt/c/Users/a$ su testusername 密码:su:身份验证失败

返回正确的密码:

testusername@DESKTOP-SomeDesktop:/mnt/c/Users/a$ su testusername 密码:要以管理员身份(用户“root”)运行命令,请使用“sudo”。有关详细信息,请参阅“man sudo_root”。

mypassword从该输出可以得出结论,上述命令序列确实为用户名设置了密码testusername

相关内容