【超初心者向け】SSH・リモート接続の概念を魂で理解する。

:::note alert
本記事はSSHのSecureの部分には一切触れません！
過去自分自身が**リモート接続**や**CLI**を感覚的に理解していなかったため、反省して言語化してみたよ！という記事です。
当時の私と同じように**SSH**や**CLI**に苦手意識を持っている方の理解の助けになれたら嬉しいです。
:::

初学者の頃にわからないながらにSSH・telnetのハンズオンを行い、接続後に表示される画面を **「SSHの画面」** という、曖昧な言葉で表現していました。
### なぜならSSHで接続した先の画面だから！

当時の私は、SSHとは何か特別で、SSHでしか辿り着けない場所(?)があるような感覚を持っていたかもしれません。
しかし上司に説明する際に「今、SSHの画面を見てます！」と伝えても何も伝わりません。ブチギレられます。

当時を振り返り、不足していた感覚を言語化してみようと思います。

># 何を解決する技術なのか？から考えよう

SSHとはネットで繋がった機器にリモート接続するためのプロトコル(http的なやつ)です。
リモート接続とは何を解決する技術なのでしょうか？言葉の定義から深掘りましょう。


> ## まず「リモート」という言葉の意味

このリモートという言葉、どなたのご家庭にもある**あるもの**の名称に含まれています。
うちの3歳の娘でもものの名前となんとなくの使い方を知っています。

それはなんでしょうか？

そう、**リモコン(リモートコントローラー)** です！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/626865df-7bbe-fcac-de9d-35f90e9e8dd4.png" width=20%>

リモコンとはリモート(遠隔)コントロール(操作)するための装置です。

日常に溶け込みすぎていて無意識に使っているかもしれませんが、リモコンがない状態だと機器本体（テレビやエアコン）のコントロールパネルで操作しなくてはいけません。

つまり、***「機器本体まで移動・接近せずとも操作できる」*** という物理的な問題を解決しています。
すごいぜリモコン！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/91a975ee-3af8-628d-2850-a386295afc43.png" width=50%>

> ## では「リモート接続」とはなんなのか

例えば、お母さんに電話で指示しながらコンピューターを操作してもらうとしましょう！
これもある意味では(本人の)***物理的な問題を解決した操作方法***といえるのではないでしょうか？
ここでは便宜上、 **OTCP(Okan Telephone Controll Protocol)** とでも名付けましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/5bf10522-4658-fab5-68b8-cd62fb06e0ac.png" width=50%>

:::note alert
現代社会においてOTCP(Okan Telephone Controll Protocol)の使用は推奨されておりません。
お母さんを大切にしましょう。
:::

しかしできれば自分で操作したい！
離れた場所にあるコンピューターに***ネット通信を介して機器に接続する***ことをリモート接続といいます。(前提として対象のコンピューターは通信ネットに接続されています)

そしてリモート接続により直接操作できるようになります。

>## どのように操作するのか？

SSHでは**CLI**による操作を行います。

コンピューターの操作には**CLI(Command Line Interface)とGUI(Graphical User Interface)** があります。おおまかに、文字・コマンドベースでの操作か？アイコンなどクリックして視覚的・直感的に操作できるものか？の違いです。

- まずお馴染みGUIで理解
スマホの画面なんかもGUIですね。
    <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/85a56d0a-3456-6f43-ad6f-3e9df96401df.png" width=15%>

    遠隔でGUIの操作を行うには **RDP(Remote Desktop Protocol)** を使用します。
オフィスワークをしたことがある方なら在宅勤務などで使用した経験があるのではないでしょうか？直感で自分がいつも接続しているPCに自宅から接続できている！と感じたことかと思います。
特定のコンピューターにリモート接続し、操作している感覚が理解できると思います。

- では**CLI**は？
***基本的にはCLIもGUIも同じことをやっています。***
ほとんどの業務用のサーバーや機器などは負荷の軽減のためGUIをもっていません（または無効な状態）。
当時の私はサーバーやシステムというものに過剰な妄想を抱き、さらに慣れないCLIでの操作で**なにかすごいことができる・難しいことをしている**という気になっていました。
確かにCLIのほうが柔軟で細かな操作が可能ですが、当然のことながら、そのコンピューターにできることしかできません。

:::note
個人的には**CLIへの過剰な特別感は理解を邪魔する**と思います。
GUIでの〇〇のように置き換えたほうが理解が早い気がします。
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3862039/334f2c95-6a53-9741-92e7-f9d95964067a.png" width=50%>

>## つまりSSH（リモート接続）ってなんなの

- 遠くから直接操作できるよ！
- 方法はCLIだよ！
- CLIは特別じゃないよ！

>## じゃあ「SSHの画面」ではなく、何て呼べばいいの？
**〇〇(機器・端末名)のCLI** や **SSHで〇〇(機器・端末名)に接続している** という表現をしましょう。
もちろん文脈的にSSHの画面で十分伝わる場面も多いと思います。しかし、自分が今どの**機器・端末**の操作を行っているのか？と自覚することは非常に重要です。

:::note warn
### なぜ**シェル**と呼ばないの？と思ったあなたへ

"SSH"という名称はそもそも**S**ecure**SH**ellの略です。
だったら「シェル画面を見ている」という表現でいいのではないか？？と思った方もいらっしゃると思います。

基本的にLinuxなどのUNIXベースな環境はShellです。WindowsでもPowerShellが使われていたりしますが、SSHで接続して操作する画面にはデータベースやネットワーク・インフラ機器などの独自のCLIも含まれているため***必ずしもCLI=Shellではありません。*** 
確信がないときは大きな括りで**CLI**と言っておけば間違いありません。
:::

本来自分が今どこに接続できているのか？を理解できるように解説する記事にしたかったのですが、まとめるのに時間がかかりすぎたので一旦ここで投稿します。
最後までお読みいただきありがとうございました。

:::note
あとがき：概念すぎたかもしれない。
:::