useradd の -d オプションはホームディレクトリを作成する場合がある

useraddコマンドの-dオプションは、作成するユーザーのホームディレクトリのパスを指定する。RHEL系のディストリビューションでは、-dオプションでパスを指定すると、指定したディレクトリが作成される。

Rocky Linux 9での実行例を示す。

$ useradd -d /opt/app appuser
$ ls -ld /opt/app
drwx------ 2 appuser appuser 4096 Jun 12 15:18 /opt/app
$ grep appuser /etc/passwd
appuser:x:1000:1000::/opt/app:/bin/bash

-mオプションを指定していなくても、/opt/appディレクトリが作成されている。

アプリケーション実行用ユーザーなど、ホームディレクトリが不要なユーザーを作成したい場合、ディレクトリが作成されては困る。

-M オプションでホームディレクトリの作成を抑止する

-Mオプション(長いオプション名は--no-create-home)を指定すると、ホームディレクトリを作成せずにユーザーを作成する。

$ useradd -d /opt/app2 -M appuser2
$ ls -ld /opt/app2
ls: cannot access '/opt/app2': No such file or directory
$ grep appuser2 /etc/passwd
appuser2:x:1001:1001::/opt/app2:/bin/bash

/opt/app2ディレクトリは作成されない。/etc/passwdにはホームディレクトリとして/opt/app2が登録される。

ディレクトリが作成されるかは CREATE_HOME の設定で決まる

-m-Mのどちらのオプションも指定しない場合にホームディレクトリを作成するかどうかは、/etc/login.defsCREATE_HOMEの設定で決まる。

RHEL系のディストリビューションではCREATE_HOMEyesに設定されているため、-dオプションだけでもディレクトリが作成される。

$ grep CREATE_HOME /etc/login.defs
CREATE_HOME	yes

一方、DebianではCREATE_HOMEが設定されておらず、デフォルトのnoとして扱われる。そのため-dオプションを指定してもディレクトリは作成されない。

$ useradd -d /opt/app appuser
$ ls -ld /opt/app
ls: cannot access '/opt/app': No such file or directory

ディストリビューションによって挙動が異なるため、ホームディレクトリを作成したくない場合は-Mオプションを明示的に指定する。逆に、確実に作成したい場合は-mオプションを指定する。

オプションの組み合わせによる挙動は以下である。

オプションCREATE_HOME yesCREATE_HOME no
指定なし作成される作成されない
-m作成される作成される
-M作成されない作成されない

具体例

アプリケーション実行用ユーザーを、ホームディレクトリなしで作成する。あわせて-sオプションでログインシェルを/sbin/nologinにしてログインを禁止する。

$ useradd -M -s /sbin/nologin -d /opt/myapp myapp
$ grep myapp /etc/passwd
myapp:x:1002:1002::/opt/myapp:/sbin/nologin

デーモンの実行ユーザーなど、ログインとホームディレクトリが不要なユーザーをシンプルに作成できる。

参考