Linuxの基礎 3日目

# 3日目

## 1 ファイル管理

### 1-1 ファイルの基本操作
- ファイルをコピーするには**cp**コマンドを使う
  ```
  # cpコマンド書式
  $ cp [オプション] コピー元ファイル名 コピー先ファイル名
  $ cp [オプション] コピー元ファイル名 コピー先ディレクトリ

  # 同じディレクトリ内で、diary.txtをmydiary.txtとしてコピー
  $ cp diary.txt mydiary.txt

  # /etc/hostsをmyhosts(ディレクトリ)としてコピー
  $ cp /etc/hosts myhosts

  # /etc/hostsをカレントディレクトリにコピー
  $ cp /etc/hosts .
  ```
  - cpコマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -i(--interactive) | 上書きする前に確認する(interactive) |
    | -v(--verbose) | 経過を表示する(verbose) |
    | -n(--no-clobber) | 存在するファイルを上書きしない(no-clobber) |
    | -f(--force) | 強制的に上書きする(force) |
    | -b(--backup=方法) | 上書きされるファイルのバックアップを作る(backup) |
    | -S(--suffix=接尾辞) | バックアップファイルを作る際のファイル名末尾に付ける文字（無指定時は「~」1文字、または環境変数「SIMPLE_BACKUP_SUFFIX」に従う）(suffix) |
    | -d | シンボリックリンク自体をコピーする（--no-dereference --preserve=linksと同様） |
    | -s(--symbolic-link) | コピーの代わりにシンボリックリンクを作成する(symbolic-link) |
    | -l(--link) | コピーの代わりにファイルのハードリンクを作成する(link) |
    | -L(--dereference) | コピー元のシンボリックリンクを常にたどる(dereference) |
    | -P(--no-dereference) | コピー元にあるシンボリックリンクをたどらない(no-dereference) |
    | -r,-R(--recursive) | 	コピー元にディレクトリを指定した場合、再帰的に（サブディレクトリも含めて）コピーする(recursive) |
    | -t ディレクトリ名(--target-directory=ディレクトリ名) | 「-t」で指定したディレクトリにコピーする |
    | -T(--no-target-directory) | コピー先（最後の引数）がディレクトリでも特別扱いしない |
    | -a(--archive) | サブディレクトリや属性なども含め、可能な限り全てを保持しながらコピーする（-dR --preserve=allと同様）(archive) |
    | -u(--update) | コピー元のファイルがコピー先ファイルより新しいか新規ファイルの場合だけコピーする(update) |
    | -p | パーミッションと所有者とタイムスタンプを保持する（--preserve=mode,ownership,timestamps相当） |
    | --preserve[=属性リスト] | 指定した属性を保持する。属性を指定しなかった場合は、mode（パーミッション）、ownership（所有者）、timestamps（タイムスタンプ）が保持される。その他、context（コンテキスト情報）、links（ディレクトリ内のハードリンク）、xattr（ファイルシステムの拡張属性）、all（可能な限り全ての属性）を指定可能 |
    | --no-preserve=属性リスト | 指定した属性を保持しない |
    | --attributes-only | ファイルのデータをコピーせず、ファイルの属性のみコピーする |


- **mv**コマンドは、ファイルの移動やファイル名の変更に使うことができる
  ```
  # mvコマンド書式
  $ mv 移動元ファイル 移動先ディレクトリ
  $ mv 移動元ファイル 移動先ファイル名

  # myhostsファイルを/tmpディレクトリ以下に移動
  $ mv myhosts /tmp

  # ファイル名の変更
  $ mv hosts hosts_mv

  ★ ファイル名の変更はmvコマンドで行う！！
  ```
  - mvコマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -f(--force) | 強制的に上書きする(force) |
    | -i(--interactive) | 上書きする前に確認する(interactive) |
    | -n(--no-clobber) | 存在するファイルを上書きしない(no-clobber) |
    | -u(--update) | 移動先にある同名ファイルのタイムスタンプが同じ、または新しい場合は移動しない(update) |
    | -t ディレクトリ名(--target-directory=ディレクトリ名) | 「-t」で指定したディレクトリに移動する |
    | -T(--no-target-directory) | 移動先（最後の引数）がディレクトリでも特別扱いしない |
    | --strip-trailing-slashes | 移動元ファイルの最後にあるスラッシュ（/）を取り除く |
    | -b(--backup=方法) | 上書きされるファイルのバックアップを作る |
    | -S(--suffix=接尾辞) | バックアップファイルを作る際の、ファイル名末尾に付ける文字（無指定時は、「~」1文字、または環境変数「SIMPLE_BACKUP_SUFFIX」に従う）(suffix) |
    | -v(--verbose) | 経過を表示する(verbose) |
- ファイルを削除するには**rm**コマンドを使う
  ```
  # rmコマンド書式
  $ rm [オプション] ファイル名

  # hosts_mvファイルを削除
  $ rm hosts_mv

  # hosts_mvファイルを削除(削除前に確認)
  $ rm -i hosts_mv
  ```
  - rmコマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -f(--force) | 存在しないファイルを無視する(force) |
    | -i(--interactive) | 削除前に確認する(interactive) |
    | -v(--verbose) | 経過を表示する(verbose) |
    | -d(--directory) | unlinkでディレクトリを削除する(directory) |
    | -r,-R(--recursive) | 	ディレクトリを(再帰的に)削除する(recursive) |
    | --preserve-root | 「/」を削除しない（デフォルト） |
    | --no-preserve-root | 「/」を特別なものとして扱わない |

### 1-2 ディレクトリの基本操作
- ディレクトリを作成するには**mkdir**コマンドを使う
  ```
  # mkdirコマンド書式
  $ mkdir [オプション] ディレクトリ名

  # testdirディレクトリを作成
  $ mkdir testdir

  # 複数階層でのディレクトリを作成➀
  $ mkdir top // 第一階層ディレクトリ作成
  $ mkdir top/sub // topディレクトリ内にsubディレクトリを作成

  # 複数階層でのディレクトリを作成➁
  $ mkdir -p top/sub
  ```
  - mkdirコマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -m(--mode) | 作成するディレクトリのパーミッションを設定する(mode) |
    | -p(--parents) | 必要に応じて親ディレクトリも作成する(parents) |
    | -v(--verbose) | 経過を表示する(verbose) |
- ディレクトリをコピーするときは**cp**コマンドに「-r」オプションが必要
  ```
  # topディレクトリを/tmpディレクトリ以下にコピー
  cp -r top /tmp
  ```
- ディレクトリを移動するには、オプションなしの**mv**コマンドを使うまた、ディレクトリ名の変更も可能
  ```
  # ディレクトリ名の変更
  $ mv top new
  ```
- ディレクトリを削除するには**rm**コマンドに「-r」オプションが必要
  ```
  # ディレクトリの削除
  $ rm -r new

  # ディレクトリを削除するrmdirというコマンドもあるが、ディレクトリが空でない場合は、rmdirコマンドでは削除できないので注意が必要
  $ rmdir new
  ```

### 1-3 ファイルとディレクトリの圧縮と展開
- ファイルを圧縮するには**gzip**コマンドや**zip**コマンドを使う
  - GNU Zip(gzip)形式でファイルを圧縮する際は、**gzip**コマンドを使用する
    ```
    # gzipコマンドの書式
    gzip ファイル名

    # gzipコマンドを実行するとファイル名の末尾が「.gz」となる圧縮ファイルに上書きされる。

    # 圧縮する前のファイルを残したまま圧縮するには、以下のコマンドを実行する
    $ gzip -c ファイル名 > 圧縮ファイル名(.gzファイル)

    # gzipコマンドはディレクトリの圧縮には対応していないので注意！！
    ```
  - zip形式でファイルやディレクトリを圧縮する際は、**zip**コマンドを使用する
    ```
    # ファイルやディレクトリを圧縮
    $ zip [-r] 圧縮ファイル名 ファイル名 または ディレクトリ名

    # servicesファイルを圧縮
    $ zip services.zip services

    # dataディレクトリを圧縮
    $ zip -r data.zip data

    # また、zipコマンドはgzipコマンドとは異なり、元ファイル(圧縮前ファイル)は削除されないので注意！！
    ```
    - zipコマンドの主なオプション
      | オプション | 説明 |
      | ---- | ---- |
      | -f(--freshen) | 変更があったファイルの分だけZIPファイルを更新する |
      | -u(--update) | 変更があったファイルの更新または新規ファイルの追加だけを行う |
      | -d(--delete) | 指定したファイルをZIPファイルから削除する |
      | -m(--move) | ZIPファイルに移動する（元のファイルは削除される） |
      | -r(--recurse-paths) | ディレクトリ内のファイルを再帰的に扱う |
      | -T(--test) | 動作をテストする（異常があった場合ZIPファイルは更新されず、「-m」オプション指定時のファイル削除も行わない） |
      | -t 日付(--from-date=日付) | ファイルの更新日が指定した日付以降のものを対象とする（日付は「mmddyyyy」で指定） |
      | -@ | 処理対象のファイル名を標準入力から読み込む |
      | -z(--archive-comment) | ZIPファイルにコメントを追加する（コメントは圧縮後に入力） |
      | -q(--quiet) | エラーメッセージなどを表示しない |
      | -v(--verbose) | 経過を表示する(verbose) |
- 圧縮ファイルを展開するには**gunzip**コマンドや**unzip**コマンドを使う
  - GNU Zip(gzip)ファイルを解凍するには、**gunzip**コマンドを使用する
    ```
    # gunzipコマンドの書式
    gunzip 圧縮ファイル名

    # gunzipコマンドを実行すると圧縮ファイルが削除され、解凍されたファイルだけが残る

    # 圧縮ファイルを残したまま解凍するには、以下のコマンドを実行する
    $ gunzip -c 圧縮ファイル名(.gzファイル) > ファイル名
    ```
  - 圧縮されたファイルやディレクトリを解凍するには、**unzip**コマンドを使用する
    ```
    # unzipコマンドの書式
    unzip 圧縮ファイル名

    # services.zipファイルを解凍
    $ unzip services.zip

    # また、unzipコマンドはgunzipコマンドとは異なり、圧縮ファイルは削除されないので注意！！
    ```
    - unzipコマンドの主なオプション
      | オプション | 説明 |
      | ---- | ---- |
      | -u | 更新があったファイルまたは新規ファイルだけを展開する |
      | -f | ファイルの更新だけを行い、新規作成はしない |
      | -o | 	ファイルを確認なしに上書きする |
      | -n | 	ファイルを上書きしない |
      | -x | 	展開しないファイルを指定する |
      | -d ディレクトリ | 指定したディレクトリに展開する |
      | -j | ディレクトリを作成せずに展開する |
      | -P | パイプで受け取ったファイルを展開する |
      | -C | ファイル指定時の大文字小文字を区別する |
      | -L | 展開するファイル名を小文字にする |
      | -l | ZIP内のファイルを一覧表示する |
      | -t | ZIPファイルに破損がないかテストする（どのように展開されるかを確認することも可能） |
      | -z | ZIPファイルのコメントを表示する |
      | -q | 動作中のメッセージを減らす（「-qq」でさらに減らす） |
      | -v | 動作中のメッセージを詳しくする |
      | -M | 動作中のメッセージを「more」コマンドで表示する |

- **gzip**コマンド/**gunzip**コマンドの主なオプション
  | オプション | 説明 |
  | ---- | ---- |
  | -1～-9 | 圧縮レベル（「-1」が低圧縮率で高速、「-9」は高圧縮率だが低速）|
  | -c(--stdout,--to-stdout) | 結果をファイルではなく標準出力へ出力する（主にパイプで別コマンドに渡す際に使用）|
  | -d(--decompress,--uncompress) | 伸張を行う（gunzipのデフォルト）|
  | -f(--force) | 強制的に上書きする(force) |
  | -k(--keep) | 圧縮前／伸張前のファイルを残す(keep) |
  | -l(--list) | 圧縮率と圧縮前のファイルサイズを表示する（圧縮ファイルに対して使用）(list) |
  | -N(--name) | ファイル名とタイムスタンプを保持する(name) |
  | -n(--no-name) | ファイル名とタイムスタンプを保持しない(no-name) |
  | -q(--quiet) | エラーメッセージなどを表示しない(quiet) |
  | -r(--recursive) | ディレクトリを再帰的に処理する(recursive) |
  | -S 拡張子(--suffix 拡張子) | 圧縮ファイルの拡張子を指定する（無指定時は「.gz」）(suffix) |
  | -t(--test) | 圧縮ファイルをテストする(test) |
  | -v(--verbose) | 経過を表示する(verbose) |

- アーカイブを作成・展開するには**tar**コマンドを使う
  ```
  # tarコマンドのアーカイブ作成書式
  tar cvf アーカイブファイル名 ディレクトリ名

  # archiveディレクトリを作成しアーカイブする
  $ tar cvf archive.tar archive/

  # archive.tarファイルを圧縮
  # gzipコマンドで圧縮すれば、ディレクトリを圧縮したことになる
  $ gzip archive.tar

  # tarコマンドのアーカイブ展開書式
  tar xvf アーカイブファイル名

  # archive.tarファイルを展開
  $ tar xvf archive.tar

  # 圧縮(gzip)アーカイブを作成・展開書式
  tar czvf アーカイブファイル名 ディレクトリ名
  tar xzvf アーカイブファイル名

  # archiveディレクトリを圧縮アーカイブ化
  $ tar czvf archive.tar.gz archive

  # 圧縮アーカイブarchive.tar.gzを展開
  $ tar xzvf archive.tar.gz
  ```
  - **tar**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | c(--create) | アーカイブを作成する |
    | x(--extract,--get) | アーカイブを展開する |
    | v(--verbose) | 詳細を表示する |
    | f(--file=アーカイブ) | アーカイブファイルを指定する |
    | j(--bzip2) | bzip2圧縮を利用する |
    | J | xz圧縮を利用する |
    | z(--gzip) | gzip圧縮を利用する |
  - tarコマンドの注意点
    - アーカイブの作成時はc、展開時はxオプションを使う。同時は使用しない
    - vオプションは付けなくても構わない
    - gzip圧縮を利用するときはzオプションを使う

## 2 ユーザーとグループ

### 2-1 ユーザーとは？
- ユーザーごとに固有のIDとしてユーザーID(UID)が割り当てられている
  ```
  # UID(ユーザーID)の確認(id)コマンド書式
  id [ユーザー名]

  # idコマンドの実行例
  $ id
  uid=1000(general0917) gid=1000(general0917) groups=1000(general0917),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)

  $ id general0917
  uid=1000(general0917) gid=1000(general0917) groups=1000(general0917),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
  ```
  - ユーザー名とUIDの対応は、ユーザー情報が格納されたファイル/etc/passwdに記載されている
- ユーザーには、一般ユーザー、システムユーザー、rootユーザーがある
  - 一般ユーザー
    - システムを利用するためのユーザーで、ログインして作業したり、メールアカウントを利用したりする
    - ユーザーIDは**100**以上
      - 
  - システムユーザー
    - システムプログラムやサーバソフトウェアを実行するために使われる特別なユーザーで、ログインには利用されない
      - ユーザーIDは**1~99**の間(**99**以下)
  - root(管理者)ユーザー
    - システム全体を制御する権限を持っている。WindowsでのAdministratorユーザーに相当する
      - ユーザーIDは**0**
- **su**コマンドを使うとログアウトせずに別のユーザーとして作業ができる
  ```
  # suコマンドの書式
  su [-] [ユーザー名]

  # rootユーザーに切り替える
  $ su -
  Password: root_user_password
  $
  $ pwd
  $ /root

  # 元のユーザーに戻る
  $ exit
  ```
  - **su**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -f | 初期設定ファイル(.bashrc)を実行しない |
    | -l, - | ログイン・シェルを使用してユーザーを切り替える |
    | -m, -p | 環境変数"HOME"，"USER"，"LOGNAME"，"SHELL"を変更しない |
    | -c | ユーザ切り替え後、commnadを実行する |
    | -s shell | 指定したシェルを実行する |
    | --help | ヘルプ |
    | user[arg...] | ログインするユーザーを指定する |
- **sudo**コマンドを使うとrootユーザーのパスワードを入力しなくてもrootユーザーの権限が必要な操作を実行できるようになる
  ```
  # rootユーザーの権限が必要なコマンド実行書式
  sudo コマンド

  # /etc/shadowファイルの末尾を表示
  $ sudo tail /etc/shadow
  [sudo] password for user: your_user_password
  ```
  - **sudo**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -A | パスワード入力用のコマンドを使用する（コマンドは「/etc/sudo.conf」または環境変数「SUDO_ASKPASS」で設定） |
    | -n | パスワードを要求するプロンプトを表示しない（パスワード入力が必要なコマンドの場合はエラーとなって実行できない） |
    | -p 文字列 | パスワード入力時のプロンプトを指定する（デフォルトは「:」記号） |
    | -S | パスワードを端末ではなく標準入力から読み込む（パスワードの末尾には改行が必要） |
    | -k | 保存されている認証情報を無効にする（次回のsudo実行時には必ずパスワード入力が必要）。コマンドと一緒に使用可能 |
    | -K | 保存されている認証情報を完全に消去する |
    | -V | 保存された認証情報を更新する |
    | -u ユーザー | コマンドを実行するときのユーザーを「ユーザー名」または「ユーザーID（#記号と数字）」で指定する |
    | -g グループ | コマンドを実行するときのグループを「グループ名」または「グループID（#記号と数字）」で指定する |
    | -P | sudoを実行するユーザーが所属するグループのままコマンドを実行する |
    | -b | 指定したコマンドをバックグラウンドで実行する |
    | -e | 指定したファイルを編集する（コマンドは「sudoedit」を使用する） |
    | -E | 現在の環境変数を保持してコマンドを実行する |
    | -H | 環境変数「HOME」をrootユーザーのホームディレクトリに変更してコマンドを実行する |
    | -s | 環境変数「SHELL」で指定されたシェル、またはrootユーザーのシェルを実行する。コマンドを指定しなかった場合は対話シェルとなる |
    | -i | 	rootユーザーのデフォルトのシェルをログインシェルとして実行する。コマンドを指定しなかった場合は対話シェルとなる |
    | -l | sudoを実行するユーザーに許可されているコマンドを一覧表示する。「sudo -l コマンド」のようにコマンドを指定した場合、コマンドが許可されていればコマンドの絶対パスを表示する |
    | -ll | 「-l」オプションと同様だが、長い形式で表示する |
    | -U ユーザー | 「-l」オプションと組み合わせて使用し、指定したユーザーの権限で実行できるコマンドを一覧表示する |


### 2-2 グループとは？
- ユーザーは何らかのグループに所属しなければならない
  - ユーザーは最低限1つのグループには所属しなければならない！！
- ユーザーは複数のグループに所属することができる
  - 複数のグループに分けで、アクセス制限(ファイルやサーバなど)をすることが可能
- ユーザーが所属しているグループは**groups**コマンドか**id**コマンドで調べることができる
  ```
  # groupsコマンドでの所属グループ確認書式
  groups [ユーザー名]

  # ユーザー名なしでのgroupsコマンド
  # ログインしているユーザーのgroupsが表示される
  $ groups
  general0917 adm dialout cdrom floppy sudo audio dip video plugdev netdev docker

  # ユーザー名指定でのgroupsコマンド
  $ groups general0917
  general0917 : general0917 adm dialout cdrom floppy sudo audio dip video plugdev netdev docker

  # idコマンドによる所属グループの確認
  # ログインしているユーザーのid(グループid)が表示される
  $ id
  uid=1000(general0917) gid=1000(general0917) groups=1000(general0917),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)

  $ id general0917
  uid=1000(general0917) gid=1000(general0917) groups=1000(general0917),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),117(netdev),1001(docker)
  ```
- ユーザーでもっとも基本となるグループをプライマリグループという
  - 多くのディストリビューションでは、一般ユーザーを作成すると、そのユーザー名と同じグループが作られ、それがプライマリーグループになる
  - プライマリーグループ以外にも参加しているグループがあるとき、それらのグループは**サブグループ(参加グループ)**と呼ばれる

### 2-3 ユーザーとグループの管理
- ユーザーを作成するには**useradd**コマンドを使う。パスワードは**passwd**コマンドで設定する
  ```
  # ユーザー作成のコマンド書式
  useradd ユーザ名

  # happyユーザーを作成
  $ su -
  password: root_user_password
  $ useradd happy

  # ホームディレクトリを確認
  $ ls /home
    happy

  # パスワード設定のコマンド書式
  passwd [ユーザー名]

  # happyユーザーにパスワードを設定
  $ passwd happy
    Changing password for user happy.
    New password: enter_new_your_password.
    Retype new password: enter_new_your_password.
    passwd: all authentication tokens updated successfully.

  # 自身のパスワードを変更（ログインしているユーザーのパスワードを変更する）
  $ passwd
  ```
- ユーザー情報は、**/etc/passwd**ファイルに格納される
  - ユーザー情報のフォーマットは以下になる
    ```
    ユーザ名:旧パスワード欄(現在は「x」のみ):ユーザーID(UID):グループID(GID):コメント:ホームディレクトリ:デフォルトシェル

    $ cat /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    happy:x:1000:1000::/home/happy:/bin/bash
    ```
- パスワード情報は、**/etc/shadow**ファイルに格納されている
  ```
  $ cat /etc/shadow
  root:$6$YsDch3Eo$mApZITA7o1P04cHS4WKyc4IUr/aGkeqMpR1nC5ECNMag5IB3DfnLMycBUSQVn6yZ3wwkENdKgUDpI7WfoMVNm1:19573:0:99999:7:::
  bin:*:18353:0:99999:7:::
  daemon:*:18353:0:99999:7:::
  adm:*:18353:0:99999:7:::
  lp:*:18353:0:99999:7:::
  sync:*:18353:0:99999:7:::
  shutdown:*:18353:0:99999:7:::
  halt:*:18353:0:99999:7:::
  mail:*:18353:0:99999:7:::
  operator:*:18353:0:99999:7:::
  games:*:18353:0:99999:7:::
  ftp:*:18353:0:99999:7:::
  nobody:*:18353:0:99999:7:::
  systemd-network:!!:18579::::::
  dbus:!!:18579::::::
  happy:$6$7NvpSYU.$6lueshZCJkuoEsM4qgaNG4dbDwfely3uZTD5/zwiP6MKOaOrkrqTHYqjQcAHG0zwKr8MN50//H1e.xO86Vvi01:19573:0:99999:7:::
  ```
- グループを作成するには**groupadd**コマンドを使う
  ```
  # グループ作成のコマンド書式
  groupadd グループ名

  # smileグループの作成
  $ groupadd smile
  ```
- ユーザーにグループを参加するには**usermod**コマンドを使う
  ```
  # ユーザーのグループを変更する際のコマンド書式
  usermod -G グループ名 ユーザー名

  # happyユーザーをsmileグループに追加
  $ usermod -G smile happy
  uid=1000(happy) gid=1000(happy) groups=1000(happy),1001(smile)
  ```
- グループ情報は、1グループにつき1行のエントリとして「/etc/group」ファイルに格納されている
  - グループ情報のフォーマットは以下になる
    ```
    グループ名:旧パスワード欄(現在は「x」のみ):グループID(GID):所属ユーザー

    $ cat /etc/group
    root:x:0:
    bin:x:1:
    daemon:x:2:
    sys:x:3:
    adm:x:4:
    tty:x:5:
    disk:x:6:
    lp:x:7:
    mem:x:8:
    kmem:x:9:
    wheel:x:10:
    cdrom:x:11:
    mail:x:12:
    man:x:15:
    dialout:x:18:
    floppy:x:19:
    games:x:20:
    tape:x:33:
    video:x:39:
    ftp:x:50:
    lock:x:54:
    audio:x:63:
    nobody:x:99:
    users:x:100:
    utmp:x:22:
    utempter:x:35:
    input:x:999:
    systemd-journal:x:190:
    systemd-network:x:192:
    dbus:x:81:
    happy:x:1000:
    smile:x:1001:happy
    ```
- ユーザーの削除には**userdel**、グループの削除には**groupdel**コマンドを使う
  - ユーザの削除には**userdel**コマンドを利用する(ユーザー情報を削除する際は、ユーザーとホームディレクトリを削除する)
    ```
    # ユーザー削除のコマンド書式
    userdel [-r] ユーザー名

    # ユーザーhappyの削除
    $ su -
    $ userdel happy

    # ホームディレクトリの削除
    $ userdel -r /home/happy

    # ホームディレクトリごとユーザhappyを削除
    $ userdel -r happy
    ```
  - グループを削除する際は、**groupdel**コマンドを利用する
    ```
    # グループ削除のコマンド書式
    groupdel グループ名

    # smileグループの削除
    $ groupdel smile
    ```