设想
使用以下命令自动为 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 字符:25
- wsl 测试测试测试测试 | 密码
~~~~~~
- 类别信息:ObjectNotFound:(密码:字符串)[],CommandNotFoundException
- 完全限定错误 ID: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
hence:
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 命令时管道工作方式出错所致。
从命令行运行 WSL 不会创建登录 shell。具体来说,未设置 PATH,因为 WSL 从 Windows 父 CMD 继承了 PATH 环境变量。
您需要准确指定
passwd
文件的路径,这可能是/usr/bin/passwd
(但我没有使用这个旧产品)。再说一句,该命令
testPassword testPassword | passwd
不会传递带有testPassword
和的两行testPassword
,但我认为这不是必需的。chpasswd 命令更好(如果在 WSL 中可用):
请记住添加完整路径,这可能需要一些
sudo
魔法。这些不一定是最少的步骤,但它们已在以下系统类型中得到验证:10 Pro N 64 位(台式机),版本 1709,构建 16299.192 和 WSL Ubuntu 16.04.2 LTS,来源在这里。
在 Windows 功能中启用“WSL”并重新启动后:
显然,@harrymc给出的相同命令不适
wsl
用于它前面的,但确实适用于bash -c
.testusername
:返回错误密码:
返回正确的密码:
从该输出中,可以得出结论,上述命令序列确实
mypassword
为 username设置了密码testusername
。