WSL(Ubuntu)でユーザ追加したら履歴とかコマンド補完が使えなかった
概要
WSL環境のUbuntu でユーザ追加(useradd) して、別ユーザでログインしたらコマンド補完もコマンド履歴もalias も使えなかったので色々試行錯誤しました。
環境
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ホストはwindows11です(事象の原因とは関係ないと思います)
事象
WSLでユーザを追加(useradd)して、suでシェルを開こうとしたところ、
tab補完や↑キーでの履歴取得ができませんでした。
$ useradd TESTUSER
$
特にエラーなく終わる
$ su - TESTUSER
$
su もエラーなくプロンプトが返る。
しかし、tabを押しても補完されないし、↑キーを押しても制御キー?が表示されるだけ(^[[A とか)になってしまいました。
原因調査
- もしかしてログインシェルが違うのでは?
と思い付き、プロセスを確認
$ ps -ef |grep "sh"
... sh
... bash
bashだけでなくshが出てました...
初期ユーザでログインしてからsu - TESTUSER しているので、
bash が初期ユーザ、shがTESTUSERだと思われます。
- 初期シェルで設定されていると思ったので、/etc/passwdを確認
$ cat /etc/passwd |grep TESTUSER
TESTUSER:x:1234:1234::/home/TESTUSER/:/bin/sh
TESTUSERの行の末尾が/bin/sh のログインシェルになっています。
後述しますが、ubuntu wsl の/bin/sh は/bin/dash へのシンボリックリンクです。
これではbashの補完機能も呼ばれません。
ちなみに初期ユーザの/etc/passwd のログインシェルは、やはり/bin/bashになっていました。
対応策
対応策1
usermod でログインシェルを/bin/bashに変更。
$ usermod -s /bin/bash TESTUSER
また、今後追加する際は
$ useradd -s /bin/bash NEWUSER
で追加するようにしようと思います。
対応策2
$ man useradd すると、/etc/default/useradd にログインシェルの設定がある様子でした。
$ cat /etc/default/useradd
# Default values for useradd(8)
#
# The SHELL variable specifies the default login shell on your
# system.
# Similar to DSHELL in adduser. However, we use "sh" here because
# useradd is a low level utility and should be as general
# as possible
SHELL=/bin/sh
確かにここで/bin/shが指定されているので、これを/bin/bashに変えても対応はできそうです。
でもどうも注釈を読むと、shから変えてほしくない様子。
useradd の度にログインシェルを指定するほうがよいかもしれません。
感想
- 久しぶりにlinuxを触りましたが、割と基本的なところで躓いてしまったかもしれません...
- wsl では /bin/sh -> /bin/dash にシンボリックリンクされているようで、bashではなく従来の/bin/sh だけを必要とするなら、こちらのほうが良いという記事も見かけました。それを考えると、useradd の初期設定である /etc/default/useradd に/bin/sh、すなわち/bin/dash が指定されているのもわかる気がします。
- 一方で初期ユーザは自動的に/bin/bashが初期シェルとしてよばれているので、wslの初期ユーザ設定ではbashを指定しているということなのだろうと思うのですが、違いがあって面白かったです。
Discussion