Linuxの基礎 4日目

# 4日目

## 1 パーミッション

### 1-1 所有者と所有グループ
- ファイルやディレクトリには所有者と所有グループが設定されている
  - ファイルやディレクトリを作成した所有者と所有グループは**ls -l**コマンドで確認可能
    ```
    # 所有者と所有グループの確認
    $ ls -l
    -rw-rw-r-- 1 test1 test1   29 Aug  6 16:56 diary1.txt
    drwxrwxr-x 2 test1 test1 4096 Aug  6 16:56 testdirectory1
    ```
- 所有者を変更するには**chown**コマンドを使用する
  ```
  # 所有者の変更(chown)書式コマンド
  chown [-R] 所有者名 ファイル名 または ディレクトリ名

  # chownコマンドの実行例➀(ファイル名の所有者変更)
  $ su -
  Password: root_your_password
  $ chown test2 diary1.txt 
  $ ls -l diary1.txt
  -rw-rw-r-- 1 test2 test1 29 Aug  6 16:56 diary1.txt

  # chownコマンドの実行例➁(ディレクトリ名の所有者変更)
  # しかし、以下のコマンド例ではディレクトリ内のファイルの所有者は変更されない(指定したディレクトリのみ変更される)
  $ chown test2 testdirectory1/
  $ ls -ld testdirectory1/
  $ drwxrwxr-x 2 test2 test1 4096 Aug  6 16:56 testdirectory1/

  # chownコマンドの実行例➂(ディレクトリ以下すべてのファイルやサブディレクトリの所有者をまとめて変更する(「-R」オプションを付与する))
  $ chown -R test2 testdirectory1/

  # chownコマンドの実行例➃(所有者と所有グループを同時に変更したい場合は、chownコマンドで「ユーザー名:グループ名」もしくは「ユーザー名.グループ名」と指定すると同時に変更可能)
  $ chown test3:test3 diary1.txt
  $ ls -l diary1.txt
  -rw-rw-r-- 1 test3 test3 29 Aug  6 16:56 diary1.txt
  ```
  - **chown**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -c | 所有権が変更された場合、その詳細を表示する |
    | -f | 	エラーメッセージを表示しない |
    | -h | 	指定したファイルがシンボリックリンクの場合、シンボリックリンクのみ所有権を変更します。システムファイルやディレクトリの所有権を一括で変更する場合はこのオプションを使用する |
    | -R | 指定したディレクトリとそのディレクトリ以下のファイルやディレクトリの所有権を再帰的に変更する |
    | -v | 所有者変更の詳細を表示する。-cは、変更された場合のみ |
- 所有グループを変更するには**chgrp**コマンドを使用する
  ```
  # 所有グループの変更(chgrp)書式コマンド
  chgrp [-R] グループ名 ファイル名 または ディレクトリ名

  # chgrpコマンドの実行例➀(ファイル名の所有グループ変更)
  $ chgrp test2 diary1.txt
  $ ls -l diary1.txt
  -rw-rw-r-- 1 test2 test2 29 Aug  6 16:56 diary1.txt

  # chgrpコマンドの実行例➁(ディレクトリ名の所有グループ変更)
  $ chgrp -R test2 testdirectory1/
  drwxrwxr-x 2 test2 test2 4096 Aug  6 16:56 testdirectory1/
  ```
  - **chgrp**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -c | 変更があったとき、メッセージを表示する |
    | -f | 	エラーメッセージを表示しない |
    | -h | 	シンボリックリンク自体のグループを変更する |
    | -R | ディレクトリ内のグループも変更する |
    | -v | コマンドの実行状況を表示する |

### 1-2 パーミッションの設定
- ファイルやディレクトリには「読み出せる(r(Read))」、「書き込める(w(Write))」、「実行権(x(eXecute))」という3つのアクセス権がある
  - Linuxでは、アクセス権のことを**パーミッション**と呼ぶ
  - パーミッションにかかわらず、**root**ユーザーは全てのファイルの読み取り/書き込み/実行が可能である
  - アクセス権は以下の記号で表記する
    ```
    ・読み取り権限 = r(Read)
    ・書き込み権限 = w(Write)
    ・実行権限 = x(eXecute)
    ```
  - ファイル、ディレクトリのパーミッションは**ls -l**コマンドで確認できる
    ```
    $ ls -l
    -rw-rw-r-- 1 test3 test3   29 Aug  6 16:56 diary1.txt
    drwxrwxr-x 2 test2 test2 4096 Aug  6 16:56 testdirectory1

    # 「rw-rw-r--」の部分がパーミッションである。
       ※一番左のはディレクトリかファイルの判別記号
         ファイルの場合は「-」で表し、ディレクトリの場合は「d」で表す
    # パーミッションは左から3文字ずつ「所有者のアクセス権」、「所有グループのアクセス権」、「その他ユーザーのアクセス権」を表す
      ・この場合だと、パーミッションを閲覧方法は以下になる
      　・所有者：読み込みと書き込みが可能
      　・所有グループ：読み込みと書き込みが可能
      　・その他ユーザー：読み込みのみ可能

    # 「-」となっている箇所はアクセス権がないことを表す
    ```
    - パーミッションの例
      | パーミッション | 説明 |
      | ---- | ---- |
      | rwxrwxrwx | 全てのユーザーが読み取り/書き込み/実行可能 |
      | rw-rw-rw- | 全てのユーザーが読み取り/書き込み可能 |
      | rwxr-xr-x | 全てのユーザーは読み取りと実行が可能、所有者は書き込みも可能 |
      | rw-r--r-- | 全てのユーザーは読み取り可能、所有者は書き込みも可能 |
      | rw------- | 所有者のみ読み込み/書き込み可能 |
      | --------- | 全てのユーザーはアクセス不可 |
    - また、アクセス権は数値で表すことも可能
      ```
      ・読み取り権限 = 4
      ・書き込み権限 = 2
      ・実行権限 = 1

      # 数値でのパーミッションは、上記の数値を合算した数値になる
      # 例えば、「rw-rw-r--」を数値で表したパーミッションは以下になる
        ・所有者：(4 + 2 + 0) 
        ・所有グループ：(4 + 2 + 0)
        ・その他ユーザー：(4 + 0 + 0)

        上記のパーミッションを数値で表すと、「664」になる。
      ```

- アクセス権は**chmod**コマンドで変更できる
  ```
  # パーミッションの変更(chmod)書式コマンド
  # -Rオプションを付けると、指定したディレクトリ以下すべてのファイルのアクセス権を変更が可能
  chmod [-R] アクセス権 ファイル名 または ディレクトリ名

  # diary1.txtファイルのパーミッションを644に設定
  $ chmod 644 diary1.txt
  $ ls -l diary1.txt
  -rw-r--r-- 1 test1 test1   29 Aug  6 16:56 diary1.txt

  # testdirectory1ディレクトリのパーミッションを755に設定
  $ chmod 755 testdirectory1
  # ls -ld testdirectory1
  drwxr-xr-x 2 test1 test1 4096 Aug  6 16:56 testdirectory1

  # diary1.txtファイルに所有グループの書き込み権を追加
  $ chmod g+w diary1.txt
  $ ls -l diary1.txt
  -rw-rw-r-- 1 test1 test1   29 Aug  6 16:56 diary1.txt

  # testdirectory1ディレクトリから所有者以外の実行権を削除
  $ chmod go-x testdirectory1
  $ ls -ld testdirectory1
  drwxr--r-- 2 test1 test1 4096 Aug  6 16:56 testdirectory1
  ```
  - chmodコマンドのアクセス権記号
    |  | 記号 | 説明 |
    | ---- | ---- | ---- |
    | 操作対象 | u | 所有者 |
    |  | g | 所有グループ |
    | | o | その他ユーザー |
    | | a | 全てのユーザー |
    | 操作 | + | 権限を追加(付与)する |
    | | - | 権限を削除する |
    | | = | 権限を指定する |
    | アクセス権 | r | 読み取りを許可 |
    | | w | 書き込みを許可 |
    | | x | 実行を許可 |

  - **chmod**コマンドの主なオプション
    | オプション | 説明 |
    | ---- | ---- |
    | -c | 変更があったとき、メッセージを表示する |
    | -R | ディレクトリ内を再帰的に変更する(ディレクトリ内にある、ファイルとサブディレクトリも一緒に権限を変更する) |
    | -v | コマンドの実行状況を表示する |

## 2 テキストファイルの編集

### 2-1 viエディタの基本
- viエディタはLinuxの代表的なテキストエディタである
  - viエディタのほかに**Emacs**エディタがある
  - viエディタの上位互換であるVimがviエディタとして搭載されている
- viエディタにはコマンドモードと挿入モードがあり、モードを切り替えながら編集作業をする
  ```
  # viエディタの起動書式
  vi [ファイル名]

  # testfile.txtファイルを対象としてviエディタを起動
  # この時、testfile.txtがない場合は、作成状態になり、保存する際は新規追加される
  vi testfile.txt

  # testfile.txtに以下の文字を追加して、保存する。
  # テキストファイルに内容を追加する際は、挿入モード(i or aキーを押下)にする
  Hello, Vim

  # 保存する際には、コマンドモード(ESCキーを押下)で変更し、「:wq」でEnterキーを押下する
  :wq
  $ ls -l testfile.txt
  -rw-rw-r-- 1 test1 test1 11 Aug  6 20:46 testfile.txt

  # テキストファイルに内容が追加されていることが確認できる
  $ cat testfile.txt
  Hello, Vim

  # ファイル名を指定しないでviを起動することも可能
  # その際は、ファイルを保存する際にコマンドモード(ESCキーを押下)で変更し「:wq [ファイル名]」でファイルを新規保存する
  $ vi
  :wq testfile2.txt

  $ ls -l testfile2.txt
  -rw-rw-r-- 1 test1 test1 0 Aug  6 20:50 testfile2.txt

  # viエディタの終了
  # viエディタを終了する際はコマンドモード(ESCキーを押下)で変更し、「:q!」でEnterキーを押下する
  :q!
  ```

  - コマンドモード
    - viエディタ直後は、コマンドモードになっている
    - コマンドモードでは、キーボードから入力される文字はすべてviエディタのコマンドとみなされる
    - カーソル移動でさえ、カーソルを移動する「コマンド」を実行することで操作する。カーソル移動の主なコマンドを以下の表にまとめる
      | キー操作 | 説明 |
      | ---- | ---- |
      | h(または「←」キー) | 1文字左へ移動する |
      | j(または「↓」キー) | 1文字下へ移動する |
      | k(または「↑」キー) | 1文字上へ移動する |
      | l(または「右」キー) | 1文字右へ移動する |
      | 0 | 現在のカーソルがある行の行頭へ移動する |
      | $ | 現在のかーそるがある行の行末へ移動する |
      | gg | ファイルの先頭に移動する |
      | G | ファイルの末尾に移動する |
   - 挿入モード
     - 挿入モードには次のようなコマンドがある
       | キー操作 | 説明 |
       | ---- | ---- |
       | i | カーソル位置から入力を開始する |
       | I | カーソルの行頭に移動し、その位置から入力を開始する |
       | o | 現在のカーソルがある行の下に空白行を挿入し、その行で入力を開始する |
       | O | 現在のカーソルがある行の上に空白行を挿入し、その行で入力を開始する |
       | a | カーソルの右側の位置から入力を開始する |
       | A | カーソルを行末に移動し、その右側の位置から入力を開始する |

### 2-2 ファイルの保存と終了
- ファイルを保存するには「**:w**」を実行する
  - 「**:w ファイル名**」のようにすると、ファイル名を指定して保存(別名で保存)することも可能
  ```
  # ファイルを保存するにはコマンドモード(ESCキーを押下)に戻り、「:w」を実行する
  :w
  # 編集中のファイルを「sample_new.txt」というファイル名で保存する
  :w sample_new.txt
  ```
- ファイルを保存して終了するには「**:wq**」もしくは「**ZZ**」を実行する
- ファイルを保存しないで終了するには「**:q!**」を実行する

### 2-3 基本的な編集操作
- 「**dd**」で切り取り、「**yy**」でコピー、「**p**」で貼り付けができる
  - viエディタの主な編集コマンド
    | キー操作 | 説明 |
    | ---- | ---- |
    | dd | 現在カーソルがある行を切り取る(カット) |
    | yy | 現在カーソルがある行をコピーする |
    | d | カーソル行の次行にバッファの内容を貼り付ける |
    | x(またはDeleteキー) | カーソル位置の1文字を切り取る |
    | X(またはBackspaceキー) | カーソル位置の左の1文字を切り取る |

    ```
    # sample_new.txtファイルの編集
    $ vi sample_new.txt

    Hello, Vim.
    # Generated by NetworkManager
    nameserver 192.168.1.1

    # 切り取り後操作後のsample_new.txtファイル(カーソルを先頭行に持ってきてコマンドモードで「dd」を押下する)
    # Generated by NetworkManager
    nameserver 192.168.1.1

    # 貼り付け操作後のsample_new.txtファイル(カーソルを2行目に移動し、貼り付けコマンド「p」を実行する)
    # Generated by NetworkManager
    nameserver 192.168.1.1
    Hello, Vim.

    # 貼り付け操作を繰り返す(貼り付けてもバッファにはまだデータが残っているので、「p」を実行するごとに貼り付け可能)
    # Generated by NetworkManager
    nameserver 192.168.1.1
    Hello, Vim.
    Hello, Vim.
    Hello, Vim.

    # 1行目をコピーし、5行目に挿入した例
    # Generated by NetworkManager
    nameserver 192.168.1.1
    Hello, Vim.
    Hello, Vim.
    # Generated by NetworkManager
    Hello, Vim.
    ```
    
- 数字キーと組み合わせて、コマンドの操作を繰り返すことができる
  ```
  # 2行を切り取ったあとの状態(編集中のsample_new.txtファイルの3行目に移動し、「2dd」を実行すると、2行切り取られる。)
  # Generated by NetworkManager
  nameserver 192.168.1.1
  # Generated by NetworkManager
  Hello, Vim.

  # カーソル操作においても、この機能は利用可能
  # 「5j」と入力すると、5行下にカーソルが移動する
  ```
- 「**.**」を実行すると直前の操作を繰り返せる
  - 例えば、「x(カーソル位置の1文字切り取り)」を実行し、もう一度実行したい場合は「.」を実行すると、直前のコマンド操作(「x」)が実行される
- 「**u**」を実行すると直前の操作を取り消せる
  - 例えば、「x(カーソル位置の1文字切り取り)」を実行し、取り消したい場合は、「u」を実行すると、直前のコマンド操作(「x」)が取り消される

### 2-4 viエディタの便利な機能
- 文字列を検索するには「/」に続けてキーワードを入力する
  ```
  # 「Vim」と検索したい場合は、コマンドモードの状態で、「/Vim」を入力し、「Enter」キーを押下する
  ```
- **set**コマンドを使ってさまざまな設定を変更できる
  - viでテキストファイルを開き、コマンドモードで「**:set number**」と入力し「Enter」キーを押下すると、行の左側に行番号が追加される
  ```
  $ vi sample_new.txt

  # コマンドモードで「:set number」を入力し、Enterキーを押下する
  :set number

  # 以下のように、行の左側に行番号が追加される
  1 # Generated by NetworkManager
  2 nameserver 192.168.1.1
  3 # Generated by NetworkManager
  4 Hello, Vim.
  ```

  - setコマンドによるviエディタの設定例
    | キー操作 | 説明 |
    | ---- | ---- |
    | :set number | 行番号を表示する |
    | :set nonumber | 行番号を表示しない |
    | :set hlsearch | 検索結果のハイライト表示を行う |
    | :set nohlsearch |  |
    | :set ts=<文字数> | タブスペースを指定する |

### 2-5 その他のエディタ
- Ubuntuではnanoエディタが標準で使われている
  - CentOSでnanoを使用したい場合は、CentOSにnanoをインストールする
    ```
    # nanoエディタをインストール
    $ yum install nano

    # nanoを起動する際の書式
    nano [ファイル名]
    ```

    - nanoエディタの主な操作
      | 操作 | 説明 |
      | ---- | ---- |
      | Ctrl + G | ヘルプを表示する |
      | Ctrl + C | 現在のカーソル位置を表示する |
      | Ctrl + A | カーソル行の行頭に移動する |
      | Ctrl + E | カーソル行の末尾に移動する |
      | Alt + ^ (macの場合はoption + ^) | カーソル行をコピーする |
      | Ctrl + K | カーソル行をカットする |
      | Ctrl + U | コピーまたはカットした行を貼り付ける |
      | Ctrl + Y | 前のページに移動する |
      | Ctrl + V | 次のページに移動する |
      | Ctrl + W | 文字列を検索する |
      | Ctrl + O | 変更を表示する |
      | Ctrl + X | nanoエディタを終了する |
- デフォルトエディタは**EDITOR**変数に設定する
  - **EDITOR**変数を設定する際は、エディタが格納されている、binary(バイナリー)ファイルパスを指定する
    ```
    # nanoエディタをデフォルトエディタに設定(どちらでもよい)
    $ export EDITOR=/usr/nano
    $ export EDITOR=/usr/bin/nano

    # エディタパス(コマンドパス)を調べるにはwhichコマンドで調べる
    # which nano
    /bin/nano

    # viエディタをデフォルトエディタに設定(どちらでもよい)
    $ export EDITOR=/usr/vi
    $ export EDITOR=/usr/bin/vi
    ```