Windows環境のSublimeTextとrmateでリモートサーバ上のファイルを直接編集できるようにした話

#はじめに
####■概要
ただの簡単な環境用意した話です。
SublimeTextでリモートサーバ上のファイル直接イジれるよやったぜ！くらいの話です。

####■使ったきっかけ
編集するファイルの量が多くてviだけだとしんどかったのと、
GitやFTP使うと少し修正するだけでもステップ多くてスマートじゃなかったから

####■書こうと思った理由
軽く調べた感じポートフォワード部分の説明が、
「この2行を追加します」とか
「こう書いておきます」とか
sshconfigにこう設定すればいいってだけのものが多くてイラっとしたから
なんでポートフォワード使ってるかとかもっと書いてあげて！

まあrsub使おうとしてるならそれぐらいの知識持ってるの前提でも良いとは思うし調べてみ？って話ではあるけど、ポートフォワードって言葉すら書かれてないの多いから知らん人は調べるワード自体が分からないんじゃないかな。
あと仕事でMac使ってるけど家ではWin使ってるおじさんが、調べてる時に「sshconfigのコピペで満足してんじゃねえ！」って思ったからかな

#rmateについて
####■イケてる部分
- SublimeText上で保存したらサーバ上でもう反映されてる
- コマンド１つでSublimeTextへ連携してくれる

```lang:参考（remote）
rmate ~/work/sample.conf
```

####■イケてない部分
- ファイル単位しか無理
- 同一ファイルでも複数開けちゃうし保存できちゃう
  - 一人で使う分にはまあいいんじゃない？

####■その他
- バージョン管理したい場合はサーバ上でしよう

#使うもの
- SublimeText 2/3
- SSHクライアント
  - TeraTermとかRLoginとか
  - ポートフォワード機能あればなんでもよいです
- rmate
  - 今回のイケてるやつ

#準備編
###１．リモートサーバ上にrmateを用意する

```lang:bash(remote)
wget -O /usr/local/bin/rmate https://raw.github.com/aurora/rmate/master/rmate
chmod +x /usr/local/bin/rmate
```
###２．SublimeTextにPackageControlを用意する
SublimeTextのコンソールで、
（Win:```Ctrl+@``` Mac:```control+shift+@```)
以下を入力してインストールする

```lang:SublimeText3(console)
import urllib.request,os,hashlib; h = 'df21e130d211cfc94d9b0905775a7c0f' + '1e3d39e33b79698005270310898eea76'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by) 
```
詳細は下記リンクにて
[Instllation - Package Control](https://packagecontrol.io/installation#st3)

###３．PackageControlからrsubを用意する
SublimeTextのコマンドパレットで、
（Win:```Ctrl+Shift+p``` Mac:```command+shift+p```)
```PackageControl: Install Package```を入力後、```rsub```で検索してインストールする
> 調べてるとリモートサーバ上のrmateをrsubとリネームしてるのが多いのはここに合わせるためっぽい？

###４．ポートフォワード設定を行う
<font color="red"><b>ポートフォワードの詳細については下の方にまとめたのでそちらを参照してください</b></font>

4-1. 該当のサーバ接続設定を選択し編集をクリック
![2016-11-28_204359.png](https://qiita-image-store.s3.amazonaws.com/0/101533/57c1d4a5-8ae5-00e9-fed0-cced9245cf68.png)


4-2. 左のツリーメニューからプロトコルを選択しポートフォワードをクリック
SSHで繋いだ後なにもしたくなければ<font color="blue"><b>青枠</b></font>のチェックを入れる
![2016-11-28_174250.png](https://qiita-image-store.s3.amazonaws.com/0/101533/54eb5e30-bd0f-262f-e0c0-4f404b5a141a.png)


4-3. SSH2ポートフォワードダイアログから新規をクリック
すでに設定済みなのでリストに表示されているが何も設定していなければ空のリストになる
![2016-11-28_174430.png](https://qiita-image-store.s3.amazonaws.com/0/101533/aae12985-67d0-c2e3-da3d-4d7165f5f2cd.png)


4-4. ポートフォワード設定を行う
「Remote」を選択しListen/Connect両方のHostNameに「127.0.0.1」、Portにrmateのデフォルトポート「52698」を指定する
「Local」「Remote」はローカル→サーバ、サーバ→ローカルの向きっぽい？
「LocalSocks」は使ったことないからわからん。Mysqlのソケット指定とかそういうやつ？
※HostNameでローカルを指定する場合は「localhost」ではなく「127.0.0.1」を指定しないと動かない
![2016-11-28_174456.png](https://qiita-image-store.s3.amazonaws.com/0/101533/c991bd18-5184-4f1e-99d7-a3e8bfa451df.png)


#使い方
1. SublimeTextを起動しておく
 - SublimeTextのrsubパッケージで受け取るので起動しておかないと動作しないっぽい
 - Winでしか試してないからMacならいけるかもね？
2. ポートフォワードする設定でSSHアクセス
3. リモートサーバ上で任意のファイルをコマンドで指定する
4. SublimeText上で指定したファイルが表示される
5. 好き勝手に修正して保存するとサーバ上も反映されている

#ポートフォワーディング（SSHトンネル）について
実際にはポートフォワーディングとSSHトンネルの概念はイコールで繋がるものではないけど、ここで使われてるのは、SSHのセキュアな通信のついでにポートのやり取りしちゃおうって感じのものです
![Sitemap.png](https://qiita-image-store.s3.amazonaws.com/0/101533/aa7905a5-dcb1-4ebc-fc98-c7b9162e4861.png)
ざっと図を書いてみましたが情報量多いので軽く説明をば
上にも書いたとおり、すごいざっくり書くとSSHのセキュアな通信使うことによって他のセキュリティ突破しちゃおうって感じの仕組みです。

####■直接アクセスする場合の問題点
普通にrmateとの連携をしようとするとローカルPCのSublimeTextに接続するためにファイアウォールという障壁があります。
これを突破できるようにすると、ファイアウォールでポート番号の許可をすることになるのですが、それはそれでセキュリティ的にどうなの？ってなっちゃいます。
個人の環境だったらめったに攻撃されることはないですが、ポート番号がデフォルトの場合は開放されてるだけでもセキュリティホールになっちゃったりして危ないです。

####■SSHトンネルを使うことによる利点
図ではファイアウォールとしか書いてないですが、他にも

- ルータのファイアウォール
- Windows標準のファイアウォール
- インストールしたファイアウォール

と様々な場所でブロックされます。
普段であれば不正なアクセスを弾いてくれるありがたい障壁なのですが、こういう連携をする時にはそれぞれで許可しなければならず<del>正直邪魔なやつ</del>とても厄介なものとなったりします。

そんなファイアウォールをサクっと突破できるのがSSHトンネルです。
SSH通信の中で他のポートのやり取りも行うのでデフォルトポートで言えば22番ポートさえ空いていれば、他のポート使いたい放題な上、設定も一度覚えてしまえば簡単なものになります。

今回の例ではサーバ→ローカルのアクセスですが、ローカル→サーバなども出来るので可能性は無限大です。
<del>学生時代には各種SNSなどが学校プロキシでブロックされてたのでSSHトンネルにはめちゃくちゃお世話になりました。ええ本当に。</del>

####■ポートフォワーディングについて（おまけ）
SSHトンネルじゃないとポートフォワーディングできないってことはないです。
各種ルータ覗くと「ポート変換」だったり「ポート開放」だったりいろんな名前で同じ事ができたりします。
例えば

- 自宅PCにてリモートデスクトップ接続をデフォルトポート3389番で待機
- 自宅ルータで外部から受信した465番ポートのデータを3389番ポートから自宅ローカルネットワークへ転送
- 外部環境で3389番ポートは塞がれているけど465番ポート空いてる
- 自宅のホスト名＋465番ポートでアクセス

とかやるとリモートデスクトップ接続できちゃったりします。超便利。
<del>メール周りのポートとかはなかなか塞げないことが多いのでおすすめ。
でもあんまり悪さしないようにね</del>

こっちはおまけで遊びみたいなものなので図はないです。本題とは違うのでやりたかったら自分で頑張りましょう。やると覚えるぞ！

#最後に
書いてたらポートフォワードの話がメインっぽくなっちゃったけど、こんだけ簡単に直接編集できるよって話でした。
漠然と技術的なことに手を出すより目的があったほうが調べる意欲とか楽しさとか全然違うので、○○を実現するためにはって視点の方が楽しめるねやっぱり
でも情報がとっ散らかりすぎたので反省