suで他のユーザーに切り替えができない

EC2インスタンスで作業を行っていたとき,他のユーザーでの操作を確認したい場面があったので

$ sudo su user1

と入力したところ,

This account is currently not available.

と言われてユーザーの切り替えに失敗した.とりあえず出力されたメッセージでググってみる.
“This account is currently not available” … Please helpがヒットした./etc/passwdの中身を変更して/sbin/nologinにしたせいでrootアカウントに入れなくなった?らしい.対象ユーザーがrootかどうかの違いはあるものの,自分と似た現象が起こっている./etc/passwdの中身を確認する.

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
user1:x:1000:1000:bin/bin:/sbin/nologin
...

まず,/etc/passwdの見方をよく知らなかったので調べる.
Understanding /etc/passwd File Formatによると,/etc/passwdは以下のフォーマットになっているようだ.

USERNAME:PASSWORD:UID:GID:USER_ID_INFO:HOME_DIRECTORY:COMMAND/SHELL

各属性がコロン区切りで置かれている.

  • USERNAME: ユーザーがログインするときに使われるユーザー名.1-32文字の長さであることが条件.
  • PASSWORD: ここがxとなっている場合は/etc/shadowで暗号化されているパスワードである,という意味らしい./etc/passwdファイル自体はデフォルトで誰でも読める (permissionが644) のでここにパスワードが書かれないのは当然.
  • UID: ユーザーid.0はroot, 1-99はあらかじめ定義されているアカウント.100-999は管理用にsystem側が予約しているようだ.
  • GID: グループid./etc/groupで一覧を確認できる.
  • USER_ID_INFO: ユーザーに関するコメント.
  • HOME_DIRECTORY: ユーザーがログインしたときのホームディレクトリ.指定なしだと/になる.
  • COMMAND/SHELL: ログイン時に実行されるコマンド/シェル.

確かに,user1でログインを行うと/sbin/nologinが実行されるようになっているようだ. 以下のコマンドを実行してログイン時に実行されるコマンドを書き換える.

$ sudo usermod -s /bin/bash user1

usermod -sでユーザーのログインシェルを変更できる.もう一度/etc/passwdを確認すると,

$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
...
user1:x:1000:1000:bin/bin:/bin/bash
...

書き換わっていることを確認.この状態でsudo su user1をすると,正常にuser1としてbashを起動させることができた.

おそらく他の人がsambaユーザーを作成するときにsshでログインできないように設定をしたのを自分が知らずにその人でログインしようとして失敗した,というところなのだろう...

ちなみに,nologin実行時に出力されるメッセージは/etc/nologin.txtを追加してそこに好きなメッセージを入れることで編集できるようだ.