Linuxコマンド入門(3) ~ユーザー・グループの管理~

　ユーザーの追加，パスワードの変更，グループの管理，Linuxのシステムを管理するものならば避けては通れない作業です．GUIで簡単にできるものもありますが，CUIしか使えないマシンを使うこともまだまだあると思います．
　うっかり忘れちゃったときのためにも，ユーザー管理のコマンドをここでまとめておこうと思います．

　今回扱うコマンドは以下の通りです．

* ユーザーの追加・削除・変更
    * useradd
    * userdel
    * usermod
* グループの追加・削除・変更
    * groupadd
    * groupdel
    * groupmod
* パスワードの設定
    * passwd
    * gpasswd
* ユーザーをグループに追加・削除
    * usermod -aG
    * gpasswd -a/-d/-M
* 設定・データベースの確認
    * getent
    * id
    * groups


# 環境

* CentOS 6.8

# ユーザの追加・削除
## useradd
　「**useradd**」コマンドはまさに"user add"の意味でユーザーを追加する基本のコマンドです．Linux OSの種類によっては，adduserというコマンドも使えます．Fedoraでは必要な設定を対話的に行えるらしいので，adduserが推奨されます．一方UbuntuなどのDebian系ではグループへの追加を意味するので要注意です．CentOSではuseraddとadduserはほぼ同じものです．
 
　基本的にはデフォルト設定で作成すればよいので，指定しなければならないのは「ユーザー名」です．また，GUIで設定するときに必ず聞かれた「フルネーム」もデフォルトでは設定されないので指定してみましょう．使い方は次の通りです．
 
```shell-session
# adduser USERNAME -c FULLNAME
例：
# adduser taro -c "Momo Taro"
```

　CUIでユーザが追加できたか確認するには，`/etc/passwd`の最後の方を見ます．`/etc/passwd`は一般ユーザからも見れるアカウント情報のファイルです．
　ファイルの末尾を表示するtailコマンドを使って確認してみましょう．nオプションは表示する行数です．
 
```shell-session
# tail -n 3 /etc/passwd
```

![AddUser_3.PNG](D:\Documents\LostInForest\ScreenShot\CentOSTutorial\AddUser_3.PNG)

　ホームディレクトリやスケルトンディレクトリを作成しない場合は，MNオプションが使えます．
 
　また，useraddにはpオプションが存在します．pは"password"の意味でデフォルトパスワードを設定します．ただし，**ここに入力したパスワードは平文で処理され保存されてしまう**ので，もし設定した場合は直ちに後述する方法で変更してください．

## userdel
　「**userdel**」は"user delete"の意味でユーザーの削除に用いる．使うときは次のようにします．

```shell-session
userdel -r USERNAME
```

　rオプションをつけないと，削除したユーザーのホームディレクトリなどが削除されないまま残ってしまうので注意する必要があります．
 
## パスワードが空のアカウント
　useraddでpオプションを空欄にすると，**ユーザーが作成されてもログインすることはできません**．root権限でsuコマンドを使えばパスワードの入力をスキップできるためにログインできてしまいますが，通常は何を入力してもパスワード認証を突破できないのです．逆に，useraddでパスワードを指定しないのは，あとで安全にパスワードを設定するためでもあり，その間ログインが禁止されていることで空パスワードでログインされるのを防いでいるのです．

　`/etc/shadow`を見てみましょう．これはroot権限でしか開けないアカウント情報ファイルで，パスワードの情報なども載っています．先ほどのようにtailで見ることもできますが，データベースの情報を閲覧するコマンド**getent**を使ってみます．
  
 　getentはデータベースとキーを指定することで特定のデータベースの特定の項目だけを抜き出して表示することができます．データベースに「shadow」，キーに「hanako taro」を指定してみましょう．
  
```shell-session
getent shadow hanako taro
```

![AddUser_5.PNG](D:\Documents\LostInForest\ScreenShot\CentOSTutorial\AddUser_5.PNG)

　hanakoとtaroの情報が表示されました．/etc/passwdでhanakoの後に表示されていた「x」が何やら長い文字列になりました．これが**暗号化パスワード**です．安全のために**ハッシュ関数**というもので暗号化されているのです．

　一方，taroの方はパスワードの欄に「!!」と表示されています．これはアカウントがロックされていることを表すマークです．
 
# パスワードの設定
## passwd
　パスワードは，「**passwd**」コマンドで設定できます．引数にユーザー名を入れるとそのユーザーのパスワードを，何も入れなければ自分のパスワードを変更します．一般ユーザーは自分のパスワードしか変更できません．
 
```shell-session
# passwd taro
```

　また，passwdコマンドを使ってパスワード認証をロックしたり解除したりすることもできます．
 
```shell-session
ロック(lock)
# passwd -l USERNAME

解除(unlock)
# passwd -u USERNAME
```

　パスワードが空の場合は，そのままではロックを解除することはできません．どうしても空パスワードのアカウントを作りたいときは，強制"forced"のfコマンドを使います．
 
```shell-session
# passwd -uf USERNAME
```

![passwdUnlock_1.PNG](D:\Documents\LostInForest\ScreenShot\LinuxCmdTutorial\passwdUnlock_1.PNG)

# グループの追加・削除
## groupadd
　グループの追加は**groupadd**を用います．
 
```shell-session
# groupadd onitaiji
```

　グループの確認はgroupデータベースで確認できます．先ほどと同様にgetentコマンドで確認します．
 
```shell-session
# getent group onitaiji
onitaiji:x:503
```

## groupdel
　グループの削除は**groupdel**でできます．グループを削除するときには，そのグループIDをもつファイルがないこと，そのグループを主グループとしているユーザーがいないことを確認する必要があります．例えばユーザー「taro」が残っているのにグループ「taro」を消去してはいけません．
 
```shell-session
# groupdel GROUPNAME
```

## groupmod
　**groupmod**は，"group modify"の意味で，グループの設定を変更することができます．例えばグループIDを変えたいときには次のようにします．
 
```shell-session
# groupmod -g 600 onitaiji
# getent group onitaiji
onitaiji:x:600
```

# グループのパスワード
　グループにユーザーを追加するときなどにパスワードを入力させることができます．

## gpasswd
　**gpasswd**は”group password”の意味で，グループのパスワードを設定，変更します．
 
```shell-session
# gpasswd GROUPNAME
```

# ユーザーをグループに追加
　ユーザーをグループに追加する方法は二つあります．ひとつはusermod, もうひとつはgpasswdを利用する方法です．
 
## usermodでユーザーをグループに追加
　**usermod**は"user modify"の意味で，ユーザーの設定を変更するコマンドです．aとGのオプションを両方指定することでグループに追加できます．"append groups"としてセットで覚えておきましょう．なお，Gだけでは所属するグループのリストを引数に変更することになり，現在入っているグループから抜けてしまいます．
 
```shell-session
# usermod -aG GROUP1, GROUP2, ...
```

## gpasswdでユーザーをグループに追加・削除
　**gpasswd**はグループのパスワードを変更するコマンドでしたが，オプションでメンバーを追加したり削除したりすることができます．使い方は次の通りです．
 
```shell-session
# gpasswd -a USER GROUP    # USERをひとりGROUPに追加
# gpasswd -d USER GROUP    # USERをひとりGROUPから削除
# gpasswd -M USER1,USER2,USER3,… GROUP
        # USERのリストを設定(appendはできない)
        # USERのリストはカンマでつなぎスペースは入れない
```

![gpasswd_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/144209/0f12332e-dd4d-ab4b-d981-4a07f8d5e3ca.png)

# ユーザー情報の確認
　ユーザーの情報を取得するには，**getent, id, groups**コマンドが使えます．
## id
　**id**コマンドはユーザーのid情報をすべて表示します．オプションがたくさんあります．次のように使います．

```shell-session
$ id        # 自分のid情報をすべて表示します
$ id USERNAME        # 指定したユーザーのid情報をすべて表示します
$ id -u/-g USERNAME        # 指定したユーザーのid情報のうちuid/gidのみを表示します
$ id -Gn USERNAME        # 指定したユーザーの所属するグループの一覧を表示します
                         # nオプションはuid/gidを名前に変換します
```

## groups
　**groups**コマンドはユーザーの所属するグループをすべて表示します．引数に複数のユーザーを指定することもできます．

```shell-session
$ groups enryu hanako taro
enryu : enryu wheel users labo onitaiji
hanako : hanako users labo onitaiji
taro : taro onitaiji
```

## getent
　getentは"get entries"の略です．使い方についてもう一度まとめます．
 
```shell-session
$ getent passwd        # 登録ユーザーの情報の一覧を表示
$ getent passwd USER        # 指定したユーザーの情報のみを表示

$ getent group        # 登録グループの情報の一覧を表示
$ getent group GROUP        # 指定したグループの情報のみを表示

# getent shadow        # 登録ユーザーのパスワード情報を含めて表示
# getent gshadow        # 登録グループのパスワード情報を含めて表示
        # shadow, gshadowの表示にはroot権限が必要
```

---- 以上

# こちらもよろしくお願いいたします．
### [エンリュの迷い森｜トップページ][blogtop]

[blogtop]: http://lost-in-forest.hatenablog.com/entry/toppage