MacからWindowsにSSH接続する

皆さんこんにちは

ゼミの卒業研究（ディープラーニング、自然言語処理）のために、研究室にあるGPUを積んだPCにつなぎたいと考えかなり奮闘しました。

AWSのEC2インスタンスへのSSH接続の経験はあるのですが、実際のPCにSSH接続をするのは初めてだったため、備忘録も兼ねて記事にしたいと思います。

# 実行環境

- サーバーOS：Windows10 Home
- クライアントOS：M1 MacOS Monterey(12.4)


# 手順

サーバー(Windows)側の作業: S
クライアント(Mac)側の作業: C

1. WSLのインストール（S）
1. OenSSHのインストールおよび設定（S）
1. sshd_configの編集（S）
1. SSH鍵の作成（C）
1. 公開鍵の登録（S）
1. SSH接続（C）

# 作業

基本的にPowerShellを開くときは「管理者として実行する」を選択してください。

## WSLのインストール（S）

PowerShellを管理者として実行し以下のコマンドを実行する。

```powershell
wls --update
wsl --set-default-version 2
wsl --install -d Ubuntu
```

するとUbuntuの画面が起動され新しくユーザー名とパスワードが要求されますので入力してください。

```bash
Enter new UNIX username: ユーザー名
New password: パスワード
Retype new password: もう一度パスワードを入力
```

ここで入力したユーザー名とパスワードはSSH接続時に必要なるため、各自メモしておいてください。

## OenSSHのインストールおよび設定（S）

### OpenSSH サーバー

Windows+Sを押して、「オプション機能を追加する」と検索する。

「機能の追加」から「OpenSSH サーバー」をインストールする。
ただし、既にインストールされている場合はこの作業は行わなくて良い。

### OpenSSH 設定

PowerShellを管理者として実行する。

SSH接続時にデフォルトのターミナルをBashに変更する。

```powershell
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\bash.exe" -PropertyType String -Force
```

Firewallのポートを開放。

```powershell
netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=22
```

PC起動時にOpenSSHサーバーが自動で起動するに設定する。
これを行わないとPCを起動するたびにOpenSSHを起動するコマンドを打たなければならない。

```powershell
Set-Service sshd -StartupType Automatic
```

ここで一度PCを再起動しましょう。
再起動したら、PowerShellを管理者として実行しOpenSSHの起動状態を確認。

```powershell
Get-Service sshd

Status    Name    Displayname
------    ----    -----------
Running   sshd    OpenSSH SSH Server
```

``Status``が``Running``状態ならOKです。

## sshd_configの編集（S）

``C:\ProgramData\ssh\sshd_config``をエディタで開き、以下の2箇所を修正する。
``ProgramData``が表示されない場合は隠しファイル表示の設定を変更してください。（https://androidlover.net/android-emulator/bluestacks/windows-hidden-programdata-folder-appear.html）

```diff
- # PasswordAuthentication no
+ PasswordAuthentication yes
```

```diff
- Match Group administrators
-        AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
+ # Match Group administrators
+ #        AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```

## SSH鍵の作成（C）

今度はクライアント側に戻りSSH鍵の作成を行います。

```terminal
ssh-keygen -t rsa -b 4096 -o -a 100 -f ~/.ssh/example
```

パスフレーズが要求されるので忘れないようなフレーズを入力してください。
今回のSSH接続では特に使いません。

すると、``~/.ssh``ディレクトリに``example.pub``と``example``ファイルが作成されます。
``example``の名前を変えたい方は、SSH鍵作成コマンドの``-f ~/.ssh/example``を変更してください。

## 公開鍵の登録（S）

上で作成した``example.pub``（公開鍵）を``C:\Users\{user_name}\.ssh``に作成し、``example.pub``を``authorized_keys``に名前を変更する（拡張子なし）。

以上でSSH接続するための設定は完了です。

## SSH接続（C）

最後にSSHの接続を行います。

そのために、まずはサーバー側のIPアドレスを取得しましょう。

PowerShellを開き``ipconfig``を実行。

```powershell
ipconfig
```

そして、``IPv4``がSSH接続するIPアドレスになります。

```terminal
ssh -i ~/.ssh/example ubuntuのユーザー名@ipアドレス
```

パスワードが要求されるのでUbuntuのパスワードを入力しましょう。

# SSH接続ができない

SSH接続ができない場合、ネットワーク（パブリックネットワーク）のファイアウォールをオフにして試してみてください。（https://onl.sc/Ftj2S6c）

それでもできない場合はセキュリティソフトが許可していない、もしくはどこかの設定がミスってます。

特に会社のPCに接続するとなると、セキュリティソフトが許可していない場合が多いので、そのときは諦めましょう。

# 接続先でVSCodeを開きたい

SSH接続したはいいものの、実際に作業するとなったらエディタを使用して作業したいですよね。

その時はVSCodeの拡張機能を使って作業できるので、以下の記事を参考にしてやってみてください。

https://qiita.com/nlog2n2/items/1d1358f6913249f3e186

# いつでもSSH接続したい

SSH接続するときはサーバー側の電源がON、もしくはスリープ状態でないことが条件です。

ですので、サーバー側がスリープ状態に入らないように設定すればOKです。

以下の記事を参考に設定を行ってください。

https://faq.nec-lavie.jp/qasearch/1007/app/servlet/relatedqa?QID=020110#:~:text=1.%20%E9%9B%BB%E6%BA%90%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8B%E3%82%89%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95,-%E9%9B%BB%E6%BA%90%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%8B%E3%82%89&text=%E3%80%8CWindows%E3%80%8D%E3%82%AD%E3%83%BC%E3%82%92%E6%8A%BC%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89,%E3%81%AA%E3%81%97%E3%80%8D%E3%82%92%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

# 最後に

いかがだったでしょうか？

MacからWindowsにSSHでつなぐリソースがかなり少なかったため、このように記事にしました。

初めはMacからWindowsにつなぐとか絶対めんどいやん。。。とか思ってたんですけど、多分Windows間でSSH接続するほうがもっと大変だろうなと感じました。

何はともあれできてよかったです。

ご不明等あれば遠慮なくコメントの方にてお知らせください。

Thank you for reading

# 参考文献

https://qiita.com/TukamotoRyuzo/items/7bd4ff6810421bdc9924

https://zenn.dev/katan/articles/d3aa611964fed3