macOSでLinuxサーバにSSH接続＋SFTPクライアントを使う方法


# 1. はじめに

* WinSCPを標準で使えないmacOSでもWindowsと同じように、踏み台サーバを経由したSSH接続・SFTPクライアントを使用してファイルを送受信する方法を説明します。
    * SFTPクライアントでLinuxサーバのファイルとローカルファイルをやりとりする
    * ターミナル上でLinuxサーバを操作する
* 「すでにWindows上でWinSCPを使ってサーバに接続していて、macOSでも同じように接続したい」方向けの記事になります。
* WinSCPをWineなどを使って動かす手法もありますが、この記事では扱いません。
* クライアントPCのOSがWindowsやLinuxでも、この記事のようにSSHを手動で設定することによってサーバに接続することもできます。


**この記事の流れ**

* 2. ネットワーク構成
* 3. 事前準備
* 4. SSH設定
* 5. サーバ接続
* 6. SFTPクライアントでファイルを送受信
* 7. さいごに
* 参考文献


# 2. ネットワーク構成
この記事は、以下図1のようなネットワーク構成を前提に書いていますので、参考にされる場合はご自身のネットワーク構造をご確認ください。
「①外部IP」、「②LAN内IP」はSSH設定で使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/6a952f9a-78ca-7ad3-3d9a-7875983e730f.png)
図1. ネットワーク構成

* 学校／職場ネットワークへVPNで接続する
* 踏み台サーバがあり、その下に個々のサーバを配置している
* 事前にサーバ接続用の鍵交換を行っていて、その秘密鍵ファイルを自宅のPCに保管している
    * 踏み台サーバ用、個々のサーバ用の秘密鍵が必要です。
    * 共通の秘密鍵の場合は1つの秘密鍵で認証を行います。


# 3. 事前準備

## 3.1 ブラウザ（Safari、Chrome）などからVPNに接続できるようにする
VPN接続時にソフトウェアが必要な場合は、事前にインストールしておきます。

## 3.2 macOS用SFTPクライアントをダウンロード、インストールする
* ここでは「FileZilla」を利用します。
    * 以下のページからmacOS用のものをダウロード、インストールしてください。
    * https://filezilla-project.org/
* SFTPに対応していれば、他のクライアントでも構いません。

## 3.3 秘密鍵ファイルを配置する
* Windowsで接続に使用していた一連の秘密鍵ファイルを、`~/.ssh/` (`/Users/<ユーザ名>/.ssh/`と同じ)に配置します。
    * `~/.ssh/`とは、SSHコマンドを実行するためのファイルを格納するための専用フォルダです。
* もしSSHを今まで使ったことがない方は、ターミナルで以下（フォルダを作るコマンド）を実行してください。

```terminal
 mkdir ~/.ssh
```

* Finderで`shift + ⌘ command + G`を押すと開きたいフォルダを指定できます。`~/.ssh/`と入力すると一発で表示できるので、ファイルの管理に便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/d72b76d4-2550-f2b9-fca6-d420b0da0c26.png)

* 秘密鍵をこのフォルダに配置したら完了です。
    * WinSCPやFilezillaでは`ppk`形式の秘密鍵を利用します。
    * SSHでは、`OpenSSH`形式の秘密鍵を利用します。
    * ppk形式しか持っていない場合は、puttygenを使ってOpenSSHの形式に変換する必要があります。
        * https://ja.osdn.net/projects/winscp/wiki/ui_puttygen
        * Filezillaを使わない場合はppkファイルは必要ありません。Linuxサーバにjupyter notebookを導入していれば、ファイルのアップロード・ダウンロードはjupyter notebook上で行うこともできます。


# 4. 踏み台サーバ、ポートフォワーディングの設定
* ここでは、「テキストエディット」アプリやVSCodeなどのエディタでターミナルで動作するスクリプトを作成していきます。
* ポートフォワーディングとは、リモートPCのあるポートを、別のPCのポートへ転送することです。ここでは、踏み台サーバを経由して接続したLinuxサーバのポートを、ローカル（自分のPC）のポートに転送することを指します。
* 転送を行うことによって、ローカルPC上でリモートPCを操作できるようになります。
    * SFTPクライアントを使ってファイルをやりとりする
    * ターミナルでLinuxを操作する

## 4.1 ポートフォワーディングを行うスクリプトを作成する
* ターミナルで、このフォルダ内に空のファイル`config`を作成します。

```terminal
touch ~/.ssh/config
```

* Finderで`config`が作成されたのを確認できたら、エディタで開きます。
* 以下のように入力し、保存します（括弧内の注意書きは書かないでください）。
    * `<>`は適宜ご自身の設定に合わせてください。

```ssh
 Host <踏み台サーバの名前(好きなもので構いません)>
     User <ユーザ名>
     HostName <①踏み台サーバの外部IPアドレス>
     Port <踏み台サーバの接続が許可されているポート番号>
     IdentityFile ~/.ssh/<OpenSSH形式の秘密鍵ファイル>
     TCPKeepAlive yes
     ServerAliveInterval 60
 
 Host <目的のサーバの名前(好きなもので構いません)>
     User <ユーザ名>
     HostName <②LinuxサーバのLAN内IPアドレス>
     LocalForward 8888 localhost:8888 (Jupyter-Notebook用のポート)
     LocalForward 2022 localhost:22 (SFTP用のポート。「2022」は好きなものでもよい)
     IdentityFile ~/.ssh/<OpenSSH形式の秘密鍵ファイル>
     ProxyCommand ssh -W %h:%p <踏み台サーバの名前(上で決めたもの)>
     TCPKeepAlive yes
     ServerAliveInterval 60
```

## 4.2 SSHスクリプトの解説
* `Host 踏み台サーバの名前`：SSHでネットワークに接続するとき、まず踏み台サーバに接続するために定義します。
* `Port xxxxx`：接続許可のポートを明示します。ポート番号についてはご自身のネットワーク設定をご確認ください。
* `IdentityFile`：接続の際に認証する秘密鍵を指定します。
* `TCPKeepAlive`：一定期間通信が行われなかったときに接続を保つために指定します。
* `ServerAliveInterval`：SSH接続が中断されないように、サーバとの応答を確認するインターバル（秒）を指定します。
* `Host 目的のサーバの名前`：SSHでネットワークに接続するとき、目的のサーバに接続ために定義します。
* `LocalForward 8888 localhost:8888`：自分のLinuxサーバの8888ポートを、ローカルPCの8888ポートにポートフォワーディング（転送）します。
    * Jupyter-Notebookは8888ポートを使用しているので、ローカルも同じポートを指定してあげます。
    * ここでの`localhost:8888`とは、**「Linuxサーバから見た」ポートなので、ローカルPCのポートを指定しているわけではありません。**
* `LocalForward 2022 localhost:22`：SFTPなどのファイル転送プロトコルは、通信に22番ポートを使うことが普通なので、「Linuxサーバでの22番ポート」を、「ローカルPCの2022番ポート」にポートフォワーディング（転送）します。
    * 2022でなくても、使われていないポート（8889や3022など）なら問題ないかと思います。
* `ProxyCommand ssh -W %h:%p 踏み台サーバの名前`：踏み台サーバを経由するためのコマンドです。`-W %h:%p`オプションを指定することで、接続ポートを自動変換してくれます。
    * 踏み台サーバの名前にまず接続するのでこのように記述します。

ここまで設定できたらファイルを保存し、完了です。


# 5. サーバへ接続
## 5.1 VPN接続
* 学校／職場のVPNへ接続してください。
* VPNの接続方法は組織によって異なるためこの手順は割愛します。

## 5.2 ターミナルでサーバにSSH接続する
* ターミナルを起動し、以下のコマンドを実行するとSSH接続ができます。

```terminal
 ssh <4.で決めた目的のサーバの名前>
```

* 踏み台サーバそのものに接続したい場合は以下のコマンドを実行します。

```terminal
 ssh <4.で決めた踏み台サーバの名前>
```

* `Enter passphrase ...`と聞かれるので、秘密鍵のパスワード（鍵交換時に設定したもの、組織から提示されている場合もあります）を入力してEnterキーを押します。
    * 入力したパスワードはターミナル上で表示されません。
    * 目的のサーバに接続するときは、踏み台サーバと目的のサーバ２台に接続するので、２回認証が必要です。
        * ssh-agentを使うとパスフレーズを自動入力することができます。
        * ssh-agent：https://ygkb.jp/3988
* 認証が完了すると、Linuxサーバ（ここではUbuntu）のターミナルが起動し、サーバを操作できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/77f20658-2e53-9dae-4bab-4fc2c21dbc4e.png)


* サーバから切断したいときは、`exit`で終了できます。
* **SFTPクライアントでファイルをやり取りしたいときは、接続したままにしてください。**


# 6. SFTPクライアントでファイルを転送する
* SFTPクライアント（ここではFileZilla）を起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/3ea4ec1c-d994-3f85-94bd-b56035fcb201.png)

* 起動したら、左上のアイコン「サイトマネージャ」をクリックし、接続先を設定します。
    * プロトコル：SFTP
    * ホスト：`localhost`または`127.0.0.1`
    * ポート：`2022`（4.で設定したポート）
    * ログオンタイプ：鍵ファイル
    * ユーザー：目的のサーバでのユーザ名
    * 鍵ファイル：フルパスで鍵ファイルのパスを指定
        * ppkファイルを指定します。
        * 例：`/Users/<macOSのユーザ名>/.ssh/<秘密鍵ファイル名(*.ppk)>`


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/2bacaa5c-cdf9-f1c8-351e-f45f03e791ea.png)


* 設定を好きな名前をつけて保存してください。
* 「接続」ボタンをクリックすると秘密鍵のパスワードを求められるので入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/37a6ac07-9a6d-22d2-f3a9-d7f40576058e.png)


* 認証が完了し、Linuxサーバのファイルが表示されます。
* WindowsでのWinSCPと同じようにファイルのアップロード・ダウンロードを行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1373557/327fb48e-1603-3396-7fc7-39ebcf2d2668.png)


# 7. さいごに
* macOSでもWindowsと同じようにLinuxサーバに接続する方法を紹介しました。
* もし質問、間違っている記述などあれば気軽に連絡ください！
* WindowsでもSSHの機能を利用して同じ要領で接続することもできます。
    * SSH側で全て設定するので、PuTTYなど専用ソフトウェアの設定は必要ありません。
    * コマンドプロンプトやPowerShellの標準アプリケーションではなく、見た目や設定、ターミナルの起動をカスタマイズできるソフトウェアを使うのがおすすめです。
        * ConEmu: https://conemu.github.io/ など


# 参考文献
* .ssh/configファイルでSSH接続を管理する
    * https://qiita.com/0084ken/items/2e4e9ae44ec5e01328f1