Сценарий
После автоматической установки новой версии Windows Subsystems для Linux Ubuntu 16.04 с помощью команд:
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' не распознан как имя командлета, функции, файла сценария или исполняемой программы. Проверьте написание имени или, если был указан путь, проверьте правильность пути и повторите попытку. В C:\twInstall\pw.ps1:1 char:25
- wsl testtest testtest | пароль
~~~~~~
- CategoryInfo: ObjectNotFound: (passwd:String) [], CommandNotFoundException
- FullyQualifiedErrorId : CommandNotFoundException
Комментарий обратная связь адаптация
В настоящее время скрипты запускаются на Windows 10 Pro N 64 бит (настольный компьютер), версия 1709, сборка 16299.192 с WSL Ubuntu 16.04.2 LTS
.
- На основеответ, предложенный @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
Я подозреваю, что это связано с ошибками в работе конвейера при запуске команды wsl из cmd или powershell.
решение1
Запуск WSL из командной строки не создает оболочку входа. В частности, PATH не устанавливается, поскольку WSL наследует переменную окружения PATH от родительского CMD Windows.
Вам необходимо указать точный путь к passwd
файлу, который может быть
/usr/bin/passwd
(но я не использую этот старый продукт).
Еще одно замечание: команда testPassword testPassword | passwd
не передает две строки, содержащие testPassword
и testPassword
, но я не думаю, что это необходимо.
Thechpasswd Команда лучше (если доступна в WSL):
echo 'userid:newpasswd' | chpasswd
Не забудьте указать полный путь, и для этого может потребоваться немного sudo
магии.
решение2
Это не обязательно минимальные шаги, но они проверены на следующем типе системы: 10 Pro N 64 бит (настольный компьютер), версия 1709, сборка 16299.192 с WSL Ubuntu 16.04.2 LTS,источник здесь.
После включения «WSL» в компонентах Windows и перезагрузки:
- Сначала установите пользователя по умолчанию на 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
.