TechZone環境で学ぶLinux/VIの基本的なコマンドと操作手順

# はじめに
　今回は、TechZone環境を使ってLinuxの基本的なコマンドと操作方法を順を追って解説しました。7月に行われた社内の新人研修と重なる内容もありますが、初心者にも分かりやすく、私自身がつまずいたポイントなども含めて解説出来たらと思います。
 


## 目次
* 基本的なコマンド
* SSHログインと接続終了
*  Linuxの基本操作
    * ユーザーの作成
    * ユーザーの切り替え
    * ディレクトリとファイルの作成
    * ファイルのコピーと移動
    * タイムスタンプの変更
    * ディレクトリの削除
* VIの操作
    * vim基本的なコマンド
    * vimtutorについて
    * つまずいた点
    
***
## 基本的なコマンド一覧
| コマンド | 説明 |   
|:-:|:-:|
| ls |ディレクトリの内容を一覧表示する |     
| cd |ディレクトリの移動 |       
| pwd | カレントディレクトリの確認  |  
| touch | タイムスタンプの変更・空のファイルの作成 |  
| mkdir | ディレクトリの作成 | 
| rmdir | 空のディレクトリの削除 | 
| rm | ファイルの削除 | 
| cp | ファイル・ディレクトリのコピー | 
| mv | ファイル・ディレクトリの移動 | 
| su - | ユーザーの切り替え　|       
| whoami | ログインしているユーザーの確認 |     
| useradd | ユーザーの追加 |  
| passwd | パスワード設定 |  





## SSHログインと接続終了
 PowerShellでSSHログインを行い、```$ whoami```でログインしているユーザーを確認（itzuser）  
 
 **SSHログイン**　```ssh -i <SSH Keyファイル> -p <SSH Port> <Username>@<Public IP>```
![スクリーンショット 2024-09-19 150554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/15d52064-4063-1af0-13a0-0335b8e46db8.png)

ituserから```$ su -```で、ルートユーザーに切り替えようとすると、```su: Authentication failure```が出てしまい失敗、、、
![スクリーンショット 2024-09-19 151413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/fd683884-ac27-e52c-c509-6888d0ef7142.png)

 ```$ su -```ではなく、```$ sudo su -```を実行しログイン成功。ログインしているユーザーを確認（root）
 ![スクリーンショット 2024-09-19 154853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/c1375842-c474-1420-1263-99b3e2bd7989.png)

```$ exit```を2回実行（1回目はrootから、2回目はitzuserから）し、SSH接続を終了
![スクリーンショット 2024-09-19 154925.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/2438ef1c-6b1e-8df2-5514-82a91aeeb0d6.png)


***
##  Linuxの基本操作
### ユーザーの作成

rootユーザーにログインし、ユーザーを追加しパスワードを設定する。パスワードは2回入力するが、入力した文字は見えないので注意。8文字以下だと警告が出るため、8文字以上が望ましい。ここではmaedaを追加した。

　**ユーザー追加**　```# useradd <ユーザー名>```
　**パスワード設定**　```# passwd <ユーザ名>```

![スクリーンショット 2024-09-24 100315.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/431e4237-c985-36a7-5006-02a6d2dbd59d.png)

<font color=#808080>※ちなみに、一般ユーザーからはユーザーを追加することができず、上記のようにrootユーザーからか、下記のように一般ユーザーに一時的にroot権限を与えるsudoをつけて実行する必要あり</font>
![スクリーンショット 2024-09-24 115232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/8506eee8-1c2d-7752-7336-7b61e2d7e433.png)

<font color=#808080>※一般ユーザーからユーザーを追加（```$ sudo useradd <ユーザー名>```）し、パスワードを設定（```$ sudo useradd passwd <ユーザー名>```）。ここではappleを新規ユーザーとして追加した。</font>
![スクリーンショット 2024-09-24 115331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/c1888a8e-b47e-0a8e-5724-64371227809f.png)

### ユーザーの切り替え

rootユーザから一般ユーザーのmaedaに切り替え、ログインしているユーザーを確認（maeda）

　**ユーザーの切り替え**　```# su - <ユーザー名>```
　**ログインしているユーザーの確認**　```$ whoami```

![スクリーンショット 2024-09-24 134203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/6535aa57-6533-0804-d412-d106dbc707b9.png)

<font color=#808080>※一般ユーザー(maeda)から一般ユーザー(apple)へ切り替えるためには、appleのパスワードを入力する必要あり</font>
![スクリーンショット 2024-09-24 134230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/e28cee20-a397-836c-08b8-8bf190cf9a89.png)

### ディレクトリとファイルの作成

下記のようなディレクトリ構造を作成する。
![スクリーンショット 2024-09-24 183024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/1cc52604-12a4-0f75-a5fd-43658e258641.png)

まずは、現在自分がいるディレクトリがホームディレクトリ（```/home/<ユーザー名>```）であることを確認する。

　**カレントディレクトリの確認**　```$ pwd```
![スクリーンショット 2024-09-24 141155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/3714a086-d202-d234-3c7e-37af8871bade.png)

mkdirコマンドで、ホームディレクトリの配下にsandboxというディレクトリが作成された。lsコマンドで、sandboxが作成されているか確認。

　**ディレクトリの作成**　```$ mkdir <ディレクトリ名>```</font>
　**ディレクトリの内容を一覧表示**　```$ ls```
![スクリーンショット 2024-09-24 154024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/54408f8f-d630-92d8-6488-f8dbe096f08e.png)

cdコマンドでsandboxに移動。先ほどは、ホームディレクトリの配下に、sandboxという1つのディレクトリを作成したが、オプションの```-p```をつければ、sandoboxの配下にchildまでの複数の階層を一度に作成することができる。

　**階層的なディレクトリの作成**　```$ mkdir -p <親ディレクトリ>/<子ディレクトリ>```
 　 **ディレクトリの移動**　```$ cd <移動先のディレクトリ>```
![スクリーンショット 2024-09-24 162951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/0d2d7744-1411-5c6a-5b20-c55cbba4b16d.png)

sandboxディレクトリにいる状態から、```$ cd source/parent/child```でchildまで移動。pwdコマンドで、childディレクトリに移動できていることを確認。touchコマンドでchildディレクトリの配下にファイルを作成し、lsコマンドで確認。

　**空のファイルの作成/タイムスタンプの変更**　```$ touch <ファイル名>```
![スクリーンショット 2024-09-24 171554.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/c5e8e78c-d689-631f-9bc3-20b783c83efe.png)

### ファイルのコピーと移動

下記の図のように、先ほど作成した```sandbox/source/parent/child/<ユーザー名>.txt```を```sandbox/target```以下にコピーする
![スクリーンショット 2024-09-24 183623.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/b042c630-bf2a-bd9e-403d-eaa39c646521.png)

cdコマンドでホームディレクトリで移動し、pwdコマンドでカレントディレクトリの確認。```$ cd```に~（チルダ）がついた```$ cd ~```はホームディレクトリに移動することができる。

　**ホームディレクトリに移動**　```$ cd ~```
![スクリーンショット 2024-09-24 185644.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/ed3e0155-bf5e-710e-2492-5e0d4dcef6e7.png)

cpコマンドを使って、コピーすることができる。ここでは、ディレクトリの中身も全てコピーすることができるオプションの```-p```をつけた。

　**ファイル・ディレクトリをコピー**　```$ cp <コピー元><コピー先>```
　**再帰的にファイル・ディレクトリをコピー**　```$ cp -r <コピー元><コピー先>```
![スクリーンショット 2024-09-24 190910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/bab6ff0a-c289-1b64-88e1-624917f887f6.png)

### タイムスタンプの変更
cdコマンドで、先ほど作成したsandbox/taegetのディレクトリに移動し、lsコマンドで```maeda.txt```もコピーされているか確認する。
![スクリーンショット 2024-09-25 152347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/14786f23-8036-94da-3e7f-c79317130ac7.png)

lsコマンドのオプション```-l```では、ファイルの権限や所有者、更新日時などを確認することができる。また、```-a```をつけると、隠しファイル（```.```で始まるもの）を表示することができ、```-a```と```-l```を同時につけると、隠しファイルまで含めたファイルの詳細情報を表示することが可能になる。指定方法として、```$ ls -a -l```のように１つずつ指定しても```$ ls -al```のようにまとめて指定しても同じ結果になる。

　**ファイル・ディレクトリの詳細情報を表示**　```$ ls -l```
 　**隠しファイル・ディレクトリを含め全てを表示**　```$ ls-a```
　**隠しファイル含め全てのファイル/ディレクトリの詳細情報を表示**　```$ ls -a -l``` ```$ ls -al```
  
![スクリーンショット 2024-09-25 155800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/7b206871-8d11-37ff-0f21-304bea3d030a.png)
ここで、上の画像の```maeda.txt```の更新日時は```Sep 24 05:08```であることが確認できる。これをtouchコマンドで```$ touch -d "2000/01/02 03:04:05" maeda.txt```と指定することで、の更新日時が```JAn 2 2000```に変更された。

 　**任意の日時を指定**　```$ touch -d "yyyy/mm/dd hh:mm:ss" <ファイル名>```
![スクリーンショット 2024-09-25 170432.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/f8316a08-3e16-183f-5c0f-1c0eb428112a.png)

### ディレクトリの削除

ここでは、sandbox/targetにコピーしたchildディレクトリを削除する。rmdirは空のディレクトリを削除するものなので、これを実行すると、```maeda.txt```が入っていたchildディレクトリは削除することができず、```Directory not empty```という警告が出る。

　**空のディレクトリを削除**　```$ rmdir <ディレクトリ名>```
![スクリーンショット 2024-09-25 175344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/b53a8eb2-bbd1-90df-56ab-aebe2f7514b9.png)

この問題を解決するために、rmコマンドを使う。rmコマンドは、ファイルを削除するコマンドだが、オプションの```-r```をつけると、ディレクトリが空でなくても指定したディレクトリとその中身を全て削除することができる。

 　**ファイルの削除**　```$ rm <ファイル名>```
  　**ディレクトリ内の中身含め再帰的に削除**　```$rm -r <ディレクトリ名>```
![スクリーンショット 2024-09-25 180223.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/6bf8f157-a72c-05f3-4b85-a52fec3c4cbe.png)

##  viの操作
　**vi**とは、Linuxでテキストエディタを編集することができるコマンドのことであり、viの改良版である**vim** (vi improved)では、より高度な機能を利用することができる。
　viの4つのモードにはそれぞれ役割があり、カーソル移動や文字入力などが直感的にはできないため、初心者には扱いづらいところがあるが、viを起動するとNormalモードから始まり、ESCキーを押せば他の3つのどのモードからでもNormalモードに戻れるため、どのモードで作業しているのか分からなくなったら、**ESCキー**を押す。
  ![スクリーンショット 2024-09-26 165930.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/6decff9f-5919-43d5-56f3-5a01d751ce43.png)


### 基本的なコマンド

まずは、覚えておくと便利に使えるviの基本的なコマンドをまとめる。特に重要なものは太字にした。
| コマンド |説明|
|:-:|:-:|
|**ESC**|**Normalモードに切り替え**|
|**i**|**Insertモードに切り替え（カーソルの位置）**|
|a|Insertモードに切り替え（カーソルの直後）|
|I|Insertモードに切り替え（行頭）|
|A|Insertモードに切り替え（行末）|
|**h**|**カーソルを左に移動**|
|**j**|**カーソルを下に移動**|
|**k**|**カーソルを上に移動**|
|**l**|**カーソルを右に移動**|
|x|1文字削除|
|dd|1行削除|
|u|直前の作業の取り消し|
|yy|1行コピー|
|p|貼り付け|
|:w|ファイルを保存|
|:q|保存しないで終了|
|**:wq**|**ファイルを保存して終了**|
|**:q!**|**ファイルを保存しないで終了**|

### vimtutorについて
　vimtutorとは、vimを触ったことがない人や初心者でも短時間でvimの操作方法やコマンドの使い方をチュートリアルを通して学ぶことができるものだ。
 
 vimtutorを利用するためには、vimをインストールする必要がある。ルートユーザーに切り替え、```# dnf install vim```を実行する。
![スクリーンショット 2024-09-26 171021.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/a91c71c6-ed94-4dae-e41e-63426e443f4a.png)

ルートユーザーから一般ユーザーに戻り、```$ vimtutor```を実行する。
![スクリーンショット 2024-09-27 111225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/6f7e82d7-70c5-8925-5b8f-e619b18ecdf5.png)

チュートリアルが始まる。全部でレッスン7まであり、基本的な内容から高度な内容まで段階的に学ぶことができる。
![スクリーンショット 2024-09-26 171320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3889881/6ff1a178-f8b2-655a-cdcf-c7aee3d5de6a.png)
ここでは、レッスンの詳細内容は割愛するが、vimに慣れていない方はぜひこのvimtutorを活用してほしい。


### つまずいた点
* 操作を間違えたとき癖で```Ctrl + Z```で戻ろうとしてしまう
➡直前の作業を取り消す**uコマンド**をマスターしたことで解決
* いつもの感覚から消したい文字の直後にカーソルをおいて```xコマンド```を実行し、意図しない文字が消えてしまう
➡**消したい文字の直前にカーソル**を置かないといけない
* 自分がどのモードにいるのか忘れたまま作業を進めてしまう
➡ESCキーを使って一度ノーマルモードに入ってから作業を進める

# まとめ
　Linuxをきちんと触るのは7月の研修に続き今回が2回目でしたが、やはり練習と慣れが一番重要だと感じました。特にvimは、vimtutorで学習したおかげでコマンド操作にある程度慣れることができ、コマンドを覚えれば覚えるほど便利に使えるということを実感することができました。引き続き、基本的なコマンドのみならず更に高度なコマンドも使えるように練習したいです。