设想
使用命令自动安装适用于 Linux Ubuntu 16.04 的 Windows 子系统全新安装后:
lxrun /install /y
lxrun /setdefaultuser exampleUsername /y
新安装的用户名是:exampleUsername
。接下来,如果想要以sudo
特权执行命令,例如
yes | sudo apt update
,系统会提示输入exampleUsername
两次密码。
问题
如何使用脚本从 Windows 10 设置有密码的用户密码?
尝试
- 创建密码更改 powershell
.ps1
文件,内容如下:
wsl passwd
wsl testPassword
wsl testPassword
但它在执行时仍然会返回手动输入密码的提示:
PS C:\twInstall> ./pw.ps1 更改 exampleUser 的密码。(当前) UNIX 密码:
- 尝试将密码两次通过管道传输到 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
。
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”并重新启动后:
- 首先使用命令将默认用户设置为root:
lxrun /setdefaultuser root /y
- 然后使用命令创建另一个用户(通过将其设置为默认用户):
lxrun /setdefaultuser testusername /y
- 使用命令切换回root用户:
lxrun /setdefaultuser root /y
- 然后使用命令更改非root用户的密码:
bash -c "echo 'testusername:mypassword' | chpasswd"
看起来是相同的命令,由@harrymc 给出wsl
在它前面不能与 一起使用,但可以与 一起使用bash -c
。
- 验证:首先在命令提示符窗口中实际打开 WSL:
wsl su testusername
- 然后执行一个需要输入用户名密码的命令
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
。