Windows10でvscodeからSSHできるようになるまで

# 追記

この記事ではsshの鍵が`.ssh`ではない場所にありますが、どう考えてもよろしくないので、善良なるこの記事を見ている皆さんは素直に`.ssh`の配下に鍵を配置しましょう。

# はじめに

VSCodeには[Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)という拡張があります。まだPreview版ですが、出てからそこそこ経ったので試してみました。

# 結論

おそらくssh-agentのからみから、msys2のsshを使うのはうまく行かず、Windows10標準搭載のsshを使うことになります。

# 前提

msys2から普通に目的のサーバーにコマンドラインでsshできる状態。もちろんパスワード認証なんかじゃなくて公開鍵認証で。`~/.ssh/config`には

```apache:~/.ssh/config
Host irregular-at-tus.work
    IdentityFile ~/key_webarena/key_webarena
    Port 110
    User yumetodo
```

のようにある。つまり

```
├─.ssh
│  ├─config
│  └─known_hosts
├─key_webarena
│  ├─key_webarena
│  └─key_webarena.pub
```

のようなdirectory構成。

この記事でのSSH先はWebARENAのVPSで動いているUbuntu 18.04 Server。

Windowsでsshするのにmsys2ないしgit-bash使ってないとか有りえんので、この段階に至ってない場合は多分この拡張にお世話になることはないはず。

remoteは今の所`glibc`ベースで動いているx86_64なLinux環境のみ対応。

# Windows10標準搭載のsshとmsys2のpacmanで落とせるsshで設定を共有しつつsshできるように

## シンボリックリンクを貼る

まずは`~/.ssh/config`および設定で参照している認証鍵にシンボリックリンクを貼ります。

コマンドプロンプトを立ち上げ以下のように。ユーザー名は適宜読み替えてください。

```bat
C:\Users\yumetodo>mklink /D .ssh "C:\msys64\home\yumetodo\.ssh"
.ssh <<===>> C:\msys64\home\yumetodo\.ssh のシンボリック リンクが作成されました
C:\Users\yumetodo>mklink /D key_webarena "C:\msys64\home\yumetodo\key_webarena"
key_webarena <<===>> C:\msys64\home\yumetodo\key_webarena のシンボリック リンクが作成されました
C:\Users\yumetodo>dir | findstr SY
2017/11/17  13:03    <SYMLINKD>     .gnupg [C:\msys64\home\yumetodo\.gnupg]
2019/08/05  20:46    <SYMLINKD>     .ssh [C:\msys64\home\yumetodo\.ssh]
2019/08/01  01:01    <SYMLINKD>     key_webarena [C:\msys64\home\yumetodo\key_webarena]
```

`.gnupg`は別件なので気になさらずに・・・。

## 鍵のあるdirectoryの権限設定

`~/.ssh/config`の`IdentityFile`で指定した鍵ファイルがあるdirectoryをWindowsのエクスプローラーからたどり、プロパティ→セキュリティで以下の画面が開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/4ac4e048-e51e-b99b-e854-2d2db4d96a12.png)

さらに詳細設定を押すと以下の画面が開きます。

ここで継承の無効化を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/1f30677c-ef0d-ac83-13a3-e99c90cd746d.png)

確認画面がでるので変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/bc0a5c60-37c0-9aab-578e-690e82a5fdce.png)

すると編集ができるようになるので、「Users」と「Authenticated Users」を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/09789002-b245-4a36-8fa8-774b62436465.png)

追加を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/10e68e9a-c6d6-3f15-ef59-eed4702f9adf.png)

プリンシパルの選択を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/8b85326c-07fb-0e03-2197-1db804174d5b.png)

自分のWindowsログインユーザー名を入れて、「名前の確認」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/f69a841f-05d8-12ce-ff2c-b846a21cdb51.png)

サジェストされるのでOKで閉じます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/ca0696ec-4d96-7cca-5617-cedf02a13008.png)

「フルコントロール」にチェックを付けてOKします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/68d308b0-ece8-b640-8b8b-db21eaa32dbf.png)

最終的にこんな感じになっているはず・・・。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/b9a65204-1d83-ef0b-88ba-bf5a347d3028.png)

OKで閉じます。

## `~/.ssh/config`の権限設定

`~/.ssh/config`をWindowsのExplorerからたどってプロパティを開いて先ほどと同様に設定してきます。ただし以下の画面で「フルコントロール」ではなく「変更」に。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/f756752a-9c73-abb0-0ff9-8f17cacedace.png)

## `ssh-agent`の有効化

他にもやり方はあるのですがコマンドラインからやるなら、管理者権限のPowerShellを立ち上げて

```powershell
Set-Service ssh-agent -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
```

とすればいいです。GUIからやるなら`Service`で検索して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/85d5d64c-1bdc-0969-b5b0-ef7a3833b2ce.png)

`OpenSSH Authentication Agent`を探して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/130ef055-927d-3347-2733-6da9ef83d3f4.png)

スタートアップの種類を「自動」もしくは「自動（遅延起動）」にすればいいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/6dc471bb-6556-87aa-2513-cb1d91574ba6.png)

## `ssh-add`

```bat
C:\Users\yumetodo>ssh-add C:\msys64\home\yumetodo\key_webarena\key_webarena
Enter passphrase for C:\msys64\home\yumetodo\key_webarena\key_webarena:
Identity added: C:\msys64\home\yumetodo\key_webarena\key_webarena (yume-wikijp@live.jp)
C:\Users\yumetodo>ssh-add -l
4096 SHA256:P81NFT/HJeeQk1jXGzZeZ4cQ/XGLDKnDbgxHmFMhDgU yume-wikijp@live.jp (RSA)
```

## `ssh`

```
C:\Users\yumetodo>ssh irregular-at-tus.work
warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Welcome to Ubuntu 18.04.2 LTS (GNU/Linux 4.15.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Aug  5 20:50:22 JST 2019

  System load:  0.0                Processes:           130
  Usage of /:   46.4% of 19.56GB   Users logged in:     0
  Memory usage: 36%                IP address for ens3: 140.227.235.169
  Swap usage:   6%

 * MicroK8s 1.15 is out! Thanks to all 40 contributors, you get the latest
   greatest upstream Kubernetes in a single package.

     https://github.com/ubuntu/microk8s

 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

5 packages can be updated.
2 updates are security updates.


Last login: Mon Aug  5 20:32:52 2019 from 119.173.37.16
Agent pid 26403

yumetodo@btgf1b8n ~
```

# vscodeでSSHできるまで

## 拡張の導入

[Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)

を入れます。

設定は特に弄ることはないです。

## 接続

<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+ <kbd>P</kbd>でコマンドパレットを開いて、`Remote-SSH: Connect to Host`を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/9241c16f-c64b-9a32-08c5-73d7a528f392.png)

`~/.ssh/config`に書いたHostが列挙されます。接続したい先を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/4374a01e-f093-6ed9-a7fa-11203e544ccd.png)

接続中・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/3b55f2ad-a3e3-7b74-f416-3a8cc1f5b8bc.png)

うまくいけば`Activating Extensions...`と下に出てきます。それが終われば使えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/b2505e51-223c-3eae-32f3-ab1590d98e07.png)

## 試しに適当なDirectoryを開いてみる

ファイラータブを開くと`Open Folder`というボタンが見えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/f5f345d7-d4ab-81ae-33d6-bcb988f922df.png)

押すと現在(`HOME` directory)のリストが出てきます。試しに @Gaccho さんの [DungeonTemplateLibrary](https://github.com/Kasugaccho/DungeonTemplateLibrary)をたまたまCloneしてあったのでこれを開いてみます(謎の宣伝)。

カーソルを合わしてOKを**2回**押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/a127996d-dafc-7beb-3b67-f8e60c831f1a.png)

開けました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/83bc6e7d-a428-0c85-39d5-15dc3307b4c6.png)

## 端末を開いてみる

<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+ <kbd>@</kbd>でとくに何も苦戦せずに端末が立ち上がって普通に使える。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94177/3c8cbafd-4a4a-46dd-ba17-befbeb62095f.png)


# 次のステップ

[Visual Studio Code Remote Development Troubleshooting Tips and Tricks](https://code.visualstudio.com/docs/remote/troubleshooting)

![SSH Architecture](https://code.visualstudio.com/assets/docs/remote/ssh/architecture-ssh.png)

にも載っているように、サーバー側に入れないと動かない拡張もある。多分CMakeもそうだと思われる。そのへんを調整する必要がありそう。

全部のremoteに対して入れたい拡張を指定するには`"remote.SSH.defaultExtensions"`があるらしい。

# 参照

- [Visual Studio Code Remote Development Troubleshooting Tips and Tricks#Setting up the SSH Agent](https://code.visualstudio.com/docs/remote/troubleshooting#_setting-up-the-ssh-agent)
- [ssh-agentを使って公開鍵認証方式のsshパスワード入力を省略する方法 | server-memo.net](https://www.server-memo.net/server-setting/ssh/ssh-agent.html)
- [openssh windows bad owner or permissions - Stack Overflow](https://stackoverflow.com/questions/49926386/openssh-windows-bad-owner-or-permissions)
- [Windows 10のssh-agentをコマンド プロンプト、WSL、Git Bashで使ってみた](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)