🦔

WSL(Ubuntu)でユーザ追加したら履歴とかコマンド補完が使えなかった

2022/06/28に公開

概要

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 とか)になってしまいました。

原因調査

  1. もしかしてログインシェルが違うのでは?
    と思い付き、プロセスを確認
$ ps -ef |grep "sh"
... sh
... bash

bashだけでなくshが出てました...
初期ユーザでログインしてからsu - TESTUSER しているので、
bash が初期ユーザ、shがTESTUSERだと思われます。

  1. 初期シェルで設定されていると思ったので、/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