シナリオ
次のコマンドを使用して、Windows Subsystems for Linux Ubuntu 16.04 の新規インストールを自動的にインストールした後:
lxrun /install /y
lxrun /setdefaultuser exampleUsername /y
新しいインストールはユーザー名: でインストールされます。次に、たとえば の権限
exampleUsername
でコマンドを実行する場合、 のパスワードを2 回入力するよう求められます。sudo
yes | sudo apt update
exampleUsername
質問
パスワードを持つスクリプトを使用して Windows 10 からユーザー パスワードを設定するにはどうすればよいですか?
試み
- 次の内容を含むパスワード変更 PowerShell
.ps1
ファイルを作成します。
wsl passwd
wsl testPassword
wsl testPassword
しかし、実行すると、パスワードの手動プロンプトが返されます。
PS C:\twInstall> ./pw.ps1 exampleUser のパスワードを変更しています。(現在の) UNIX パスワード:
- 次の内容で、passwd コマンドにパスワードを 2 回パイプしてみました
pw.ps1
:
wsl testPassword testPassword | passwd
エラーを返します:
passwd: 'passwd' という用語は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前のスペルを確認するか、パスが含まれている場合はパスが正しいことを確認して再試行してください。C:\twInstall\pw.ps1:1 char:25
- wsl テストテスト テストテスト | パスワード
~~~~~~
- カテゴリ情報: ObjectNotFound: (passwd:String) []、CommandNotFoundException
- 完全修飾エラー ID: コマンドが見つかりません例外
コメントフィードバックの適応
現在、スクリプトは、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 次のコマンドでルートユーザーに戻ります。
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 を実行しても、ログイン シェルは作成されません。具体的には、WSL は Windows の親 CMD から PATH 環境変数を継承するため、PATH は設定されません。
ファイルへのパスを正確に指定する必要がありますpasswd
が、これは可能です
/usr/bin/passwd
(ただし、私はこの古い製品を使用していません)。
もう一つの注意点として、コマンドはとtestPassword testPassword | passwd
を含む 2 つの行を渡しませんが、これは必須ではないと思います。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
この出力から、上記の一連のコマンドによって実際にusername のパスワードが設定されたことがわかりますtestusername
。