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.defsのCREATE_HOMEの設定で決まる。
RHEL系のディストリビューションではCREATE_HOMEがyesに設定されているため、-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 yes | CREATE_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
デーモンの実行ユーザーなど、ログインとホームディレクトリが不要なユーザーをシンプルに作成できる。
