wslではroot作業はsudoで行うので、sudoできなくなると結構困ります。
これはwsl2で、visudoを使って失敗し、sudo できなくなったときの対処方法です。
あわせてsudoで入力する自分のパスワードを忘れた場合の対処方法も提示しています。
wsl2で実施しましたが、検索したwsl1の情報を参照して対応したので、wsl1でも使えるはずです(未確認)。
sudoersファイルを破損した場合
-
発生原因
visudo
(古い人なのでsudoers.dに慣れてないのです)で修正時に構文エラーがあると、- e: 再修正(eじゃなかったかも)
- x: 保存せず終了
- Q: そのまま終了(危険)
と表示されるのですが、ここでxとQの意味を取り違え「Q」を選んでしまいました。
すると、sudoersファイルが構文エラーの状態のまま保存されてしまい、sudoコマンドが構文エラーで失敗するようになってしまいます。
物理・仮想マシンにインストールしたlinuxであれば、boot cdやsingle user modeでリカバリーできるのですが、wsl2ではどうすればわからなかったです。
-
対応方法1
検索して発見した下の「対応方法2」を元に見つけた対処方法です。こちらのほうがすこし簡単です。
もし、うまくいかななけれ「対象方法2」を試してみてください。-
コマンドプロンプトで sudoersを変更可能にする
C:\Users\mtag> wsl -u root chmod u+w /etc/sudoers
-
コマンドプロンプトで sudoersを修正する。
C:\Users\mtag> wsl -u root vi /etc/sudoers
元の内容がわからない場合、以下の内容で更新すればとりあえず動くはずです。
Defaults env_reset Defaults mail_badpass Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" root ALL=(ALL:ALL) ALL %admin ALL=(ALL) ALL %sudo ALL=(ALL:ALL) ALL #includedir /etc/sudoers.d
-
wsl内部でsudoができるか確認する。できなければ再修正する。
-
コマンドプロンプトで sudoersを変更不可にする
C:\Users\mtag> wsl -u root chmod u-w /etc/sudoers
-
-
対応方法2
調べたところStack Exchangeに回答を見つけました。sudoに問題があるのであれば、su(switch user)ではなく、起動時にrootにしてしまえ、という対応でした。
こちらはubuntuの場合に依存した手順があります。ほかのディストリビューションの場合、読み替えが必要です。
-
コマンドプロンプトで起動時のユーザーをrootにする。
C:\Users\mtag> ubuntu config --default-user root
-
コマンドプロンプトでwslをいったん終了する
C:\Users\mtag> wsl --shutdown
-
wslを起動し、sudoersを修復する。
visudo
は使えないと思いますのでvi /etc/sudoers
で修正します。sudoを実行した時に、構文エラーがでなくなるようにしてください。
元の内容がわからない場合の内容は「対処方法1」の2に記述しています。
-
コマンドプロンプトで起動時のユーザーを元に戻しておく。
C:\Users\mtag> ubuntu config --default-user [元のwslユーザー]
-
自分のパスワードがわからなくなった場合
-
対処方法1と同じように対応できます。
-
コマンドプロンプトで rootで現在のユーザーのパスワードを修正する。
C:\Users\mtag>wsl -u root passwd [自分のwslユーザー名] New password: Retype new password: passwd: password updated successfully
-
-
対処方法2の起動ユーザーをrootで再起動したwslの中で、
password [自分のユーザー名]
でもパスワードをリセットできます。 -
こちらはほかにも方法があると思います。