turtlechanのブログ

無知の私がLinuxをいじりながら書いていくブログ

useraddコマンドを使ってみた

Linuxのユーザー管理の記事で書いた「useradd」コマンド。ろくすっぽ使ったことがなかったので、今回触ってみた。

useraddコマンド

useraddコマンドの書式とオプション

書式

コマンド 説明
useradd [オプション] ユーザー名 指定したユーザー名のユーザーを追加(作成)

オプション

オプション 説明
-c コメント 作成するユーザーに関するコメントを指定
-d ディレクトリのパス 作成するユーザーのホームディレクトリを指定
-e 日付 アカウントの失効日を指定、一時的なユーザーを作成する場合に使用
日付の書式はyyyy-mm-dd
-f 日数 パスワードの期限が切れ後、ユーザーが使用不能になるまでの日数を指定
-g グループID(名) 作成するユーザーがメインで所属するグループID(名)を指定(プライマリグループ)
-G グループID(名) 作成するユーザーがサブで所属するグループID(名)を指定(セカンダリグループ)
カンマで区切り複数指定可能
-m ホームディレクトリが存在しない場合、ホームディレクトリを作成する
同時に/etc/skel以下のファイルをホームディレクトリにコピー
-k ディレクトリのパス 任意のディレクトリ以下のファイルをホームディレクトリにコピー
(-mオプション指定時)
-o ユーザーIDの重複を許可
-p 暗号化済パスワード crypt関数で暗号化したパスワードを指定
-s シェルのパス ユーザーのログインシェルを指定
-u ユーザーID ユーザーIDを指定

デフォルト値

useraddコマンドで新規ユーザーを作成する時に各オプションを指定しなかった場合に使われる値。

useraddコマンドは、「-D」オプションを指定することでデフォルト値の確認や変更を行なうことができる。

オプション 説明
-D デフォルト値の表示
または以下のオプションと併用することでデフォルト値の変更
-b パス 新規ユーザーのホームディレクトリを置くディレクト
-e 日付 アカウントの失効日を指定
日付の書式はyyyy-mm-dd
-f 日数 パスワードの期限が切れ後、ユーザーが使用不能になるまでの日数を指定
-g グループID(名) 作成するユーザーがメインで所属するグループID(名)を指定(プライマリグループ)
-s シェルのパス ユーザーのログインシェルを指定

デフォルト値の設定ファイルは「/etc/default/useradd」

パスワードファイル /etc/passwd と /etc/shadow

Linuxではユーザーを「/etc/passwd」というファイルで管理しています。実態はテキストファイルで、どのユーザーからでも読み込めます。このファイルにはユーザー名・ユーザーID・ホームディレクトリなどの設定が書かれています。

以前は暗号化したパスワードもこのファイルに書かれていたらしいが、現在はセキュリティ強化で「/etc/shadow」ファイルに書かれるようになっている。また、「/etc/passwd」がなくなると誰もログインできなくなるので絶対に削除しないように。

「/etc/passwd」ファイルの1行は、:(コロン)で区切られた、次のようなフィールドからなっています。

第1フィールド:第2フィールド:第3フィールド:第4フィールド:第5フィールド:第6フィールド:第7フィールド
1 2 3 4 5 6 7
ユーザ名 x(暗号化パスワード) ユーザID グループID コメント ホームディレクトリのパス ログインシェル

使ってみた

useraddコマンドは管理者権限でのみ使える。

準備

suコマンドで管理者ユーザー(root)に切り替えておきます。

~$ su -

useraddのデフォルト値を確認しておきます。

~# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

オプションなし

オプションを何も付けずにアカウントを作成してみる。

~# useradd turtlechan

作成できたはず、/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

作成できていることが確認できた。パスワードを設定してないので管理者ユーザー(root)以外ログインできない。passwdコマンドで設定すればいい。長くなるので今回は省略。

結果

ログインシェルは空だったが/bin/shだった。ホームディレクトリは自動で作成されない。

-cオプション付加

「-c」オプションを付けてみる。

~# useradd -c ほげほげ turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001:ほげほげ:/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: ほげほげ
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

第5フィールドに指定したコメントがちゃんと加わってますね。

結果

日本語のコメントも入れられる。が、使わない方が良いでしょう。

-eオプション付加

「-e」オプションを付けてみる。以下の例ではすでに期限切れの日付を指定。

~# useradd -e 2000-01-01 turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

「-e」オプションは有効期限なので/etc/passwdの中身は変わりませんね。

パスワードを設定して、一般ユーザーから「turtlechan」にログインしてみます。

~$ su - turtlechan
パスワード:
アカウントの有効期限が切れました。システム管理者にお問い合わせください。
su: 認証失敗

結果

有効期限切れになりログインできない。また、有効期限間近でもログイン時に警告は表示されなかった。

-fオプション付加

「-f」オプションを付けてみる。今回は3日後とします。

~# useradd -f 3 turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

-eオプション同様/etc/passwdの中身は変わりません。

パスワードを設定して、一般ユーザーから「turtlechan」にログインしてみます。

~$ su - turtlechan
パスワード:
ディレクトリがありません。HOME=/ としてログインします
$

3行目はホームディレクトリが自動で作られていないだけなので無視。普通にログインできました。

次にパスワードの有効期限を7日に設定し、現在より11日前をパスワードを変更した日付にしてからログインを試みたら以下の様になった。

~$ su - turtlechan
パスワード:
アカウントの有効期限が切れました。システム管理者にお問い合わせください。
su: 認証失敗

結果

passwdコマンドでパスワードの有効期限を設定しないと無意味。
(パスワードの有効期限 + useradd -fオプションで指定した日数 + 1日後)アカウントの有効期限切れになる。

-gオプション付加

「-g」オプションを付けてみる。今回は「mail」を指定。

~# useradd -g mail turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:8::/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 8
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

第4フィールドの値が「8」に変わってますね。

turtlechanにログインして「id」と「groups」コマンドを打ってみます。

~# su - turtlechan
パスワード:
ディレクトリがありません。HOME=/ としてログインします
$ id
uid=1001(turtlechan) gid=8(mail) groups=8(mail)
$ groups
mail

「mail」グループに所属していることが確認できました。また、「turtlechan」グループは作成されない。


「-g」オプションに存在しないグループ名を指定すると

~# useradd -g hogehoge turtlechan
useradd: グループ 'hogehoge' は存在しません
~$ su - turtlechan
ユーザ 'turtlechan' のパスワードエントリがありません

2行目の様に怒られアカウントは作成されません。

結果

「-g」オプションには存在するグループID(名)を指定する。「-g」オプションを指定した場合、新規ユーザーのグループは作成されない。

-Gオプション付加

カンマで区切ることで複数指定できること、「-Gオプション」を指定しても新規ユーザーのグループが作成されること以外は「-g」オプションと変わりないと思われるので割愛。

-mオプション付加

「/etc/skel」ディレクトリの中を見ておきます。

~# ls -la /etc/skel
合計 28
drwxr-xr-x   2 root root  4096 10月  2  2017 .
drwxr-xr-x 132 root root 12288  5月 15 20:09 ..
-rw-r--r--   1 root root   220  5月 16  2017 .bash_logout
-rw-r--r--   1 root root  3526  5月 16  2017 .bashrc
-rw-r--r--   1 root root   675  5月 16  2017 .profile

「-m」オプションを付けてuseraddコマンドを実行すると新規ユーザーのホームディレクトリが自動で作成され、ホームディレクトリ内にこれらのファイルがコピーされるはず。

「-m」オプションを付けてuseraddコマンドをします。

~# useradd -m turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: (空)

特に変わったところはありません。

/homeディレクトリの中を見てみます。

~# ls -l /home
合計 24
drwxr-xr-x 45 hoge       hoge        4096  5月 14 16:55 hoge
drwx------  2 root       root       16384 10月  2  2017 lost+found
drwxr-xr-x  2 turtlechan turtlechan  4096  5月 15 20:09 turtlechan

turtlechanのホームディレクトリが「turtlechan」のアカウントで作成されていることが確認できます。

turtlechanのホームディレクトリの中も見てみます。

~# ls -la /home/turtlechan
合計 20
drwxr-xr-x 2 turtlechan turtlechan 4096  5月 15 20:09 .
drwxr-xr-x 5 root       root       4096  5月 15 20:09 ..
-rw-r--r-- 1 turtlechan turtlechan  220  5月 16  2017 .bash_logout
-rw-r--r-- 1 turtlechan turtlechan 3526  5月 16  2017 .bashrc
-rw-r--r-- 1 turtlechan turtlechan  675  5月 16  2017 .profile

「/etc/skel」ディレクトリの中にあったファイルがコピーされていますね。オーナーもturtlechanになってる。

実行結果は載せないが、メールスプールは作成されていなかった。

結果

ホームディレクトリを自動で作成してくれる。/etc/skel以下のファイルをホームディレクトリにコピーしてくれる。一般ユーザーを作成する場合はほぼ必須ですね。付けないで手動でコピーしてもいいけど面倒だしね。

-kオプションを付加

-mオプションと同時に使用して、/etc/skelディレクトリじゃない任意のディレクトリからコピーしてほしい時に使用するはず、割愛。

-oオプション付加

説明そのままなため、割愛。

-pオプション付加

passwdコマンドでパスワードを設定するためどうでもいい、割愛。

-sオプション付加

「-s」オプションを付けてみます。今回は「/bin/bash」を指定。

~# useradd -s /bin/bash turtlechan

/etc/passwdファイルを見てみる。

~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:/bin/bash
  1. ユーザー名: turtlechan
  2. パスワード: x(/etc/shadowファイルにある)
  3. ユーザーID: 1001
  4. グループID: 1001
  5. コメント: (空)
  6. ホームディレクトリ: /home/turtlechan
  7. ログインシェル: /bin/bash

第7フィールドが/bin/bashになってます。

ログインして確認してみます。

~# su - turtlechan
ディレクトリがありません。HOME=/ としてログインします
/$ echo $SHELL
/bin/bash
/$ help
GNU bash, バージョン 4.4.12(1)-release (x86_64-pc-linux-gnu)
~省略~

確かに/bin/bashに変わっていますね。


「-s」オプションに存在しないシェルのパスを指定すると

~# useradd -s /bin/hogehoge turtlechan
~# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
~中略~
turtlechan:x:1001:1001::/home/turtlechan:/bin/hogehoge
~# su - turtlechan
ディレクトリがありません。HOME=/ としてログインします
/bin/hogehoge を実行できません: そのようなファイルやディレクトリはありません
~#

新規ユーザーの作成では怒られませんでした。ログインシェルも/bin/hogehogeになっています。ただログインしようとすると実行できないと怒られログインすることはできなかった。

結果

新規ユーザーが使用するシェルを変えることができる。存在しないシェルを指定するとユーザーの作成はできるが、ログインは不可。

-uオプションを付加

説明そのままなため、割愛。

おわりに

割愛が多い?どうせ読まれないから無駄な努力だよ。

今回「useradd」コマンドのオプションを色々試してみたが、多分すぐ忘れる。この記事を見たら動作がすぐ分かるように細かく書いたつもり。そのせいで長くなった。

普段新規ユーザーを作成するときは最低限でこんな感じかな

~# useradd -G [グループ1, ...] -m -s /bin/bash [ユーザー名]

でも、基本的には「adduser」コマンドを使った方が良さそう。