UNIX系OSのコマンドラインインターフェイス操作を克服できる学習サイト

# はじめに
コマンドラインとは、ユーザーがキーボードから`コマンド`と呼ばれる命令文を入力して、コンピュータに命令を実行させる方法のことです。もっとも原始的なインターフェイスですが、汎用性が高いという特徴があります。とくに、LinuxやMac OS XなどUNIX系OS環境ではコーディングやシステム管理を行う際に欠かすことのできない知識の一つです。
ここでは、そんな`Command Line`操作を克服することができる学習サイトについて紹介します。

# Command Line 学習コース 基礎編 - Progate
「[Command Line 学習コース 基礎編](https://prog-8.com/languages/commandline)」は、オンラインプログラミング学習サービスの「[Progate（プロゲート）](https://prog-8.com/dashboard)」が提供しているレッスンの一つです。
ウェブサイトやアプリ作成などを前提とした基本操作の紹介に特化しています。
スライドで知識を習得し、演習で定着させるというProgateメソッドが「Command Line 学習コース」でもしっかりと反映されています。
他のレッスンと同様に、ブラウザだけで学習を進めていくことができます。パステルカラーで統一されたやわらかい雰囲気は初心者が感じる最初の障壁をうまく取り除いてくれると思います。独学ではじめるのなら、特にオススメです。
![progate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3ec47e07-4c75-7a29-a3c2-dc43f561580e.png)

# Terminus
「[Terminus](http://web.mit.edu/mprat/Public/web/Terminus/Web/main.html)」は、 全米屈指のエリート名門校の一つであるマサチューセッツ工科大学において、学生生活と学習を改善するコンテスト「iCampus Prize」の[2013年 First Round 受賞作品](http://icampusprize.mit.edu/2013/03/terminus-2013-first-round-winner/)です。
`cd`、`ls`、`less`、`mv`、`pwd`コマンドを使って遊ぶことのできるアドベンチャーゲームとして仕上げられています。
まず、`ls`コマンドを入力して、「Locations(場所)」と「Items(アイテム)」を確認するところからゲームがスタートします。
`cd ~`コマンドを入力すると、自宅（`/home`ディレクトリ）へ戻ることができる。`less AdmissionLetter`コマンドで「合格通知」を読むことができるといった演出が面白いです。
黒い画面に表示される英語のメッセージになれるという観点からもオススメです。
![Terminus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/83c3cad2-9941-04da-64b3-e680e127613f.png)

# Command Line - Linux Journey
「[Command Line - Linux Journey](https://linuxjourney.com/lesson/the-shell)」は、[Cindy Quach](https://github.com/cindyq)氏により提供されているオープンソース（[GitHub](https://github.com/cindyq/linuxjourney)）なLinux全般について無料で学ぶことのできるオンライン学習サイト「[Linux Journey](https://linuxjourney.com/)」にて提供されているコンテンツの一つです。
「Grasshopper」パートの一つとして、「[Command Line](https://linuxjourney.com/lesson/the-shell)」コースが提供されています。同じパートには「[Text-Fu](https://linuxjourney.com/lesson/stdout-standard-out-redirect)」や「[Advanced Text-Fu](https://linuxjourney.com/lesson/regular-expressions-regex)」も提供されています。
カバーしているコマンドが多いことが特徴の一つです。
このため、「[Command Line 学習コース 基礎編 - Progate](https://prog-8.com/languages/commandline)」にて提供されている内容では物足りないと感じるようになったら、Linux Journeyのコンテンツを確認してみるとよいと思います。
![linuxjourney.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/cc4699ef-e8b6-6603-2c06-e09ce3f7747f.png)

# CMD Challenge
「[CMD Challenge](https://cmdchallenge.com/)」は、[John Jarvis](https://www.jarv.org/)氏により公開されているシェルに関する知識を試すことができるオープンソースプロジェクト（[GitLab](https://gitlab.com/jarv/cmdchallenge)）です。
オープンソース化していることで、Amazon Web Servicesの無料利用枠を使って、CMD Challengeのクローンを立ち上げることができるのは非常に面白い取り組みです。
`Print "hello world".`という問題からはじまり、`awk`、`cat`、`grep`、`sed`、`wc`など文字列操作に関するコマンド知識まで要求されます。
中級者（Intermediate）レベルの人まで楽しむことができる問題構成になっていると思います。
![cmdchallenge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/3987ebc8-caa5-cec9-a53d-1e79947199a8.png)

# Bandit - OverTheWire
「[Bandit](http://overthewire.org/wargames/bandit/)」は、[OverTheWire](https://overthewire.org/wargames/)コミュニティが提供する*Wargames*の一つです。
`bash`コマンド構文を駆使して、34個のフラグ（Level 34）を取得していくことがこのゲームの目的です。
ゲームでは、セキュアシェル（SSH）プロトコルを介し`bandit.labs.overthewire.org`サーバへ接続して進めていきます。接続できるように準備することが「[Level 0](http://overthewire.org/wargames/bandit/bandit0.html)」の課題になっています。

>Bandit Level 0
>
>Level Goal
The goal of this level is for you to log into the game using SSH. The host to which you need to connect is bandit.labs.overthewire.org, on port 2220. The username is bandit0 and the password is bandit0. Once logged in, go to the Level 1 page to find out how to beat Level 1.

Windows環境であれば、SSHクライアントの「[PuTTY](https://www.putty.org/)」を使って準備することが可能です。
![PuTTY.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/4e1c43d2-1573-3e28-adf9-6bc1ed5594ef.png)

指定されたユーザアカウントとパスワード`bandit0/bandit0`を入力すれば、ゲームサーバへ接続することができます。
![bandit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/82269653-09b1-ad2a-fa7a-75aa41c364de.png)

「[Level 0 → Level 1](http://overthewire.org/wargames/bandit/bandit1.html)」の問題についても確認してみましょう。

>Bandit Level 0 → Level 1
>
>Level Goal
The password for the next level is stored in a file called readme located in the home directory. Use this password to log into bandit1 using SSH. Whenever you find a password for a level, use SSH (on port 2220) to log into that level and continue the game.

次のレベルのパスワードは、ホームディレクトリにある`readme`ファイルに保存されています。このパスワードを使用して、`bandit1`ユーザで接続すれば、ゲームを続行できるようです。それでは、パスワードを確認してみましょう。

```
bandit0@bandit:~$ ls
readme
bandit0@bandit:~$ cat readme
boJ9jbbUNNfktd78OOpsqOltutMc3MY1
```

これで、次のレベルに進むためのパスワードをゲットすることができました。このまま`bandit1`アカウントを指定して、同じサーバ`localhost`に接続してみましょう。

```
bandit0@bandit:~$ ssh bandit1@localhost
Could not create directory '/home/bandit0/.ssh'.
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:98UL0ZWr85496EtCRkKlo20X3OPnyPSB5tB5RPbhczc.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/bandit0/.ssh/known_hosts).
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames

bandit1@localhost's password:boJ9jbbUNNfktd78OOpsqOltutMc3MY1
.
省略
.
bandit1@bandit:~$
```

これでLevel 1に進みことができました。これ以降もパスワードを探し、ユーザ名の数字部分をレベル数に変更して、取得したパスワードを指定し`ssh`コマンドでログインしていくことでゲームを進めることができます。

Banditでは、`Commands you may need to solve this level`（このレベルを解決するために必要なコマンド）が各レベルで示されています。もし、解けないレベルがあれば、ヒントとして示されているコマンドを調べれば、クリアできるかもしれません。
Banditは、コマンドラインの練習という域を超え、パズルゲームのような発想を問う出題になっています。
上級者（Expert / Advanced）レベルの人まで楽しむことができる問題構成になっていると思います。

# TryHackMe
「[TryHackMe](https://tryhackme.com/)」は、サイバーセキュリティに関する学習プラットフォームです。
クラウド上にホスティングされている仮想マシンを含むコース（TryHackMe上では「room」と呼ばれています）を提供しています。
「room」（仮想教室）では、単に仮想マシンを提供するだけでなく、質問と回答を繰り返す対話的なアプローチによって、知識習得を目指すことができるように工夫されています。
多くのルームは有償（subscribers向け）に提供されています。一部のルームのみ無料（free room）で挑戦することができます。

特にコマンドラインインターフェイスの操作克服に繋がる無料（free room）のルームは次のとおりです。

- [Learn Linux](https://tryhackme.com/room/zthlinux) - A guided room designed to teach you the Linux basics!
- [The find command](https://tryhackme.com/room/thefindcommand) - A learn-by-doing approach to the find command
- [Ninja Skills](https://tryhackme.com/room/ninjaskills) - Practise your Linux skills and complete the challenges.

![TryHackMe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294810/9dbfcf12-682e-3f8b-9dd4-70d43939156c.png)

>「Ninja Skills」ルームの詳細な攻略方法（Walkthrough）について、記事「[[TryHackMe] Ninja Skills - Walkthrough -](https://qiita.com/v_avenger/items/e94e31a53258737069dd)」にて紹介しています。

# まとめ
UNIX系OSのコマンドラインについてオンラインで学習できるサイト6種類を難易度順に紹介しました。

1. Command Line 学習コース 基礎編：https://prog-8.com/languages/commandline
2. Terminus：http://web.mit.edu/mprat/Public/web/Terminus/Web/main.html
3. Command Line - Linux Journey：https://linuxjourney.com/lesson/the-shell
4. CMD Challenge：https://cmdchallenge.com/
5. Bandit：http://overthewire.org/wargames/bandit/
6. TryHackMe：https://tryhackme.com/

直感的に使える「グラフィカルユーザインタフェース（Graphical User Interface, GUI）」に対して、表現力の劣る黒い画面「コマンドラインインタフェース（Command Line Interface, CLI）」に苦手意識をもつ人は多いです。
一方で、単純な反復作業を行う際にCLIはとても便利です。また、人へ操作方法を伝える際にも確実に同じ操作を再現してもらうことが可能です。
ここで紹介したオンライン学習サイトを使って、ゲーム感覚で楽しく苦手克服してみてはいかがですか。