macOSからWindowsにSSHし、WSL2のUbuntuからDocker DesktopでDebianを起動する

# 前提条件

* ESXi上に構築した Windows 10 Pro 21H1

# 準備

WSL2はHyperVに依存するため、WindowsをESXiで動かす場合は **「この仮想マシンでハイパーバイザーアプリケーションを有効にする」** にしておく必要がある。

# WSL2の設定とUbuntu 20.04のインストール

**PowerShell管理者モード**

	PS> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
	PS> Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform
	
再起動を行う。

**コマンドプロンプト**

	> wsl --set-default-version 2
	> winget install Canonical.Ubuntu.2004
	> powershell Invoke-WebRequest -Uri https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi -OutFile ~/Desktop/wsl_update_x64.msi
	> %USERPROFILE%/Desktop/wsl_update_x64.msi

「スタート」から「Ubunutu 20.04 LTS」を起動し、UNIXユーザとパスワードを作成・設定し、exitで終了する。

規定のサブシステムを確認する。

**コマンドプロンプト**

	> wsl -l
	Linux 用 Windows サブシステム ディストリビューション:
	Ubuntu-20.04 (既定)

Ubunutuにログイン

**コマンドプロンプト**

	> wsl
	$ uname
	Linux DESKTOP-XXXXXX 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
	$ exit
	
# OpenSSHのセットアップ

## OpenSSHのインストール

**PowerShell 管理者モード**

	PS> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

	PS> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
	PS> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
	PS> Start-Service sshd
	PS> Set-Service -Name sshd -StartupType 'Automatic'

	PS> if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
	    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
	    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
	} else {
	    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
	}
	
別マシンから ssh ユーザ名@ホスト名 でログインできるか確認する。

## 公開鍵認証を有効にする

[OpenSSH キーの管理](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement)

リモートマシン(macOS/bash,zsh)で作業

Windowsマシンのユーザとホスト(IPアドレス)を設定

**リモートマシンのbash**

	$ export TARGET_SSH_USER_HOST="Windowsユーザ@Windowsホスト"

	$ ssh $TARGET_SSH_USER_HOST mkdir 'C:/ProgramData/ssh/'
	$ scp ~/.ssh/id_ed25519.pub $TARGET_SSH_USER_HOST:'C:\ProgramData\ssh\administrators_authorized_keys'
	$ ssh $TARGET_SSH_USER_HOST icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

次のコマンドで公開鍵でログインできればOK

**リモートマシンのbash**

	$ ssh $TARGET_SSH_USER_HOST
	> exit
	$ unset TARGET_SSH_USER_HOST

# Docker Desktop for Windowsのインストール

**コマンドプロンプト**

	> winget install Docker.DockerDesktop
	
再起動する。「I accept the terms」し、Docker Enginenの起動を待つ。コマンドプトンプトを開く。

	> docker run -d -p 80:80 docker/getting-started

http://localhost/ で Getting Started がでてくればOK

# Windows Terminal, Visual Studio Codeのインストール

**コマンドプロンプト**

	> start winget install Microsoft.WindowsTerminal
	> start winget install Microsoft.VisualStudioCode

# macOSからWindowsにSSHし、WSL2のUbuntuからDocker DesktopでDebianを起動する

**リモートマシンのbash**

	$ ssh Windowsユーザ@Windowsホスト
	> Microsoft Windows [Version 10.0.19043.1348]
	(c) Microsoft Corporation. All rights reserved.

	Windowsユーザ@DESKTOP-AAAAAA C:\Users\Windowsユーザ> wsl
	To run a command as administrator (user "root"), use "sudo <command>".
	See "man sudo_root" for details.

	UNIXユーザ@DESKTOP-AAAAAA :/mnt/c/Users/Windowsユーザ$ docker run --rm -it debian bash

	root@6534eb344f96:/# uname -a
	Linux 6534eb344f96 5.10.16.3-microsoft-standard-WSL2 #1 SMP Fri Apr 2 22:23:49 UTC 2021 x86_64 GNU/Linux
	root@6534eb344f96:/# cat /etc/debian_version
	11.1

# WSL2とDocker Desktopの接続について

## Docker DesktopのあとにWSL2とLinuxを入れた場合

Docker Desktopの Settings → Resources → WSL INTEGRATION で導入できる

## WSL2からDockerの接続が切れた場合

1. **wsl --shutdown** でWSL2を再起動
2. タスクトレイの🐋を右クリックでDocker Desktopを再起動する
4. **wsl** で Ubuntuにログイン

で復旧する

# ssh-agentの利用方法


## キーを作成する

**コマンドプロンプト**

	> ssh-keygen -t ed25519

キーは %USERPROFILE%/.ssh に作成される

## ssh-agentの起動

**PowerShell管理者モード**

	PS> Get-Service ssh-agent | Set-Service -StartupType Automatic
	PS> Start-Service ssh-agent

これでssh-agentが自動起動となる

## [ssh-agent-wsl](https://github.com/rupor-github/ssh-agent-wsl)の導入

WSL2からssh-agentを利用する場合にはこのツールが必要となる。


**コマンドプロンプト**

	> winget install 7zip.7zip
	> powershell Invoke-WebRequest -Uri https://github.com/rupor-github/ssh-agent-wsl/releases/download/v2.5/ssh-agent-wsl.7z -OutFile ~/Desktop/ssh-agent-wsl.7z
	> mkdir "%USERPROFILE%/apps/ssh-agent-wsl"
	> "C:\Program Files\7-Zip\7z.exe" x -o"%USERPROFILE%/apps/ssh-agent-wsl" "%USERPROFILE%/Desktop/ssh-agent-wsl.7z" 

**WSL2上のUbuntu Bash**

	$ eval $(/mnt/c/Users/Windowsユーザ/apps/ssh-agent-wsl/ssh-agent-wsl -r)

~/.bashrcに追記しておくとログインのたびに実行される

	$ echo 'eval $(/mnt/c/Users/Windowsユーザ/apps/ssh-agent-wsl/ssh-agent-wsl -r)' >> ~/.bashrc

ssh-add をするときは、WSL2に入る前に行う必要がある。

# 参考URL

* [OpenSSH をインストールする](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse)
* [OpenSSH キーの管理](https://docs.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_keymanagement)
* [WSL から Windows 10 の ssh-agent (OpenSSH) を利用する](https://laboradian.com/use-ssh-agent-wsl/)