Cenário
Depois de instalar automaticamente uma nova instalação de subsistemas Windows para Linux Ubuntu 16.04 com comandos:
lxrun /install /y
lxrun /setdefaultuser exampleUsername /y
uma nova instalação é instalada com nome de usuário: exampleUsername
. A seguir, se alguém quiser executar um comando com sudo
privilégios, por exemplo
yes | sudo apt update
, será solicitada a senha exampleUsername
duas vezes.
Pergunta
Como posso definir a senha do usuário do Windows 10 usando um script que possui a senha?
Tentativas
- Crie um
.ps1
arquivo PowerShell para alteração de senha com conteúdo:
wsl passwd
wsl testPassword
wsl testPassword
Mas isso ainda retorna um prompt manual para a senha quando é executado:
PS C:\twInstall> ./pw.ps1 Alterando a senha para exemploUser. (atual) senha UNIX:
- Tentei canalizar a senha duas vezes para o comando passwd com
pw.ps1
conteúdo:
wsl testPassword testPassword | passwd
que retorna erro:
passwd : o termo 'passwd' não é reconhecido como o nome de um cmdlet, função, arquivo de script ou programa operável. Verifique a ortografia do nome ou, se um caminho foi incluído, verifique se o caminho está correto e tente novamente. Em C:\twInstall\pw.ps1:1 char:25
- teste wsl teste teste | senha
~~~~~~
- CategoryInfo: ObjectNotFound: (passwd:String) [], CommandNotFoundException
- FullyQualifiedErrorId: CommandNotFoundException
Adaptação de feedback de comentários
Atualmente, os scripts são executados em um Windows 10 Pro N 64 bits (desktop), versão 1709, build 16299.192 com WSL Ubuntu 16.04.2 LTS
.
- Baseado ema resposta sugerida por @harrymc:
3.1 Primeiro defina o usuário padrão como root com o comando:
lxrun /setdefaultuser root /y
3.2 Em seguida, crie outro usuário (definindo-o como usuário padrão) com o comando:
lxrun /setdefaultuser testuser /y
3.3 execute um comando como esse usuário, caso algo precise ser inicializado no wsl para a criação do usuário:
wsl echo "hello world"
3.4 Volte para o usuário root com o comando:
lxrun /setdefaultuser root /y
3.5 Em seguida, defina o caminho para o arquivo passwd (a inspeção manual encontrou-o em: /etc/passwd
portanto:
wsl set path /etc/passwd
3.6 Em seguida, altere a senha do usuário não root com o comando:
wsl echo 'testusername:newpasswd' | chpasswd
que retorna:
'chpasswd' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.
3.7 Tentar novamente com sudo gerou o mesmo erro:
wsl sudo echo 'testusername:newpasswd' | chpasswd
retorna:
'chpasswd' não é reconhecido como um comando interno ou externo, programa operável ou arquivo em lote.
3.8 Como foram levantadas preocupações se o wsl Ubuntu 16.04.2 LTS tinha a capacidade de chpassword, tentei posteriormente no wsl manualmente, o que não gerou nenhum erro com o comando:
echo 'testusername:newpasswd' | chpasswd
3.9 Aparentemente ocorre um erro na conversão de:
echo 'testusername:newpasswd' | chpasswd
para:
wsl echo 'testusername:newpasswd' | chpasswd
Suspeito que seja devido a erros no funcionamento da tubulação quando você executa um comando wsl do cmd ou powershell.
Responder1
Executar WSL na linha de comando não cria um shell de login. Especificamente, o PATH não está definido, pois o WSL herda a variável ambiental PATH do CMD pai do Windows.
Você precisa especificar exatamente o caminho para o passwd
arquivo, que pode ser
/usr/bin/passwd
(mas não estou usando este produto antigo).
Como outra observação, o comando testPassword testPassword | passwd
não passa duas linhas com testPassword
e testPassword
, mas não acho que isso seja necessário.
Ochpasswd comando é melhor (se disponível no WSL):
echo 'userid:newpasswd' | chpasswd
Lembre-se de adicionar o caminho completo, e isso pode precisar de um pouco de sudo
mágica.
Responder2
Estas não são necessariamente as etapas mínimas, mas são verificadas no seguinte tipo de sistema: 10 Pro N 64 bits (desktop), versão 1709, build 16299.192 com WSL Ubuntu 16.04.2 LTS,fonte aqui.
Depois de habilitar "WSL" nos recursos do Windows e reiniciar:
- Primeiro defina o usuário padrão como root com o comando:
lxrun /setdefaultuser root /y
- Em seguida, crie outro usuário (definindo-o como usuário padrão) com o comando:
lxrun /setdefaultuser testusername /y
- Volte para o usuário root com o comando:
lxrun /setdefaultuser root /y
- Em seguida, altere a senha do usuário não root com o comando:
bash -c "echo 'testusername:mypassword' | chpasswd"
Aparentemente o mesmo comando,conforme fornecido por @harrymcnão funciona wsl
na frente dele, mas funciona com bash -c
.
- Verificação: primeiro abra o WSL na janela do prompt de comando:
wsl su testusername
- Em seguida, execute um comando que requer uma senha do usuário chamado
testusername
::
su testusername
retorna com a senha incorreta:
testusername@DESKTOP-SomeDesktop:/mnt/c/Users/a$ su testusername Senha: su: falha de autenticação
retorna com a senha correta:
testusername@DESKTOP-SomeDesktop:/mnt/c/Users/a$ su testusername Senha: Para executar um comando como administrador (usuário "root"), use "sudo". Consulte "man sudo_root" para obter detalhes.
A partir dessa saída, pode-se concluir que a sequência de comandos acima realmente definiu a senha mypassword
para username testusername
.