LoginSignup
3
4

More than 3 years have passed since last update.

Windowsのssh設定をWindows Subsystem for Linux(WSL)に適用する

Posted at

Windowsのssh設定をWindows Subsystem for Linux(WSL)に適用する

WindowsとWSL(Ubuntu20.04)ではホームディレクトリが違うため、Windowsのssh設定をそのまま使うことは出来ません。

ホームディレクトリを変更する方法などもあるみたいですが、ssh鍵などのパーミッションなどの問題がありうまくいかないため、
Linux標準のホームディレクトリを使用した自分なりのやり方をまとめてみます。

WSLの使用するOSバージョンによって、ホームディレクトリが変わる可能性がありますので、
使用する環境に合わせるようにお願いします。

動作環境

  • Windows 10 Home
  • OpenSSH 7.7.2.1
  • Ubuntu20.04 (Windows Subsystem for Linux)

WSLの起動

WSLを起動すると、各ドライブが/mntディレクトリにマウントされた状態になっており、
/mnt/c/Users/${USER}(Windowsのホームディレクトリ)が起動時のカレントディレクトリになります。
(私の場合はE:ドライブまでマウントされています)

ymmmtym@windows10:/mnt/c/Users/ymmmtym$ ls -l /mnt
total 0
drwxrwxrwx 1 ymmmtym ymmmtym 4096 Aug  9 19:41 c
drwxrwxrwx 1 ymmmtym ymmmtym 4096 Aug  9 19:41 d
drwxrwxrwx 1 ymmmtym ymmmtym  512 Jan  1  1980 e

また、USER(ymmmtym)とHOSTNAME(windows10)は引き継がれますが、ホームディレクトリが/home/${USER}変更されます。

ymmmtym@windows10:/mnt/c/Users/ymmmtym$ getent passwd ${USER}
ymmmtym:x:1000:1000:,,,:/home/ymmmtym:/bin/bash

そのため、ssh設定をWSLのホームディレクトリで内の/home/${USER}/.sshに置く必要があります。

Windows側のssh設定をWSLに適用する

結論、rsyncでホームディレクトリに.sshディレクトリのバックアップを作成するだけで使用できます。
パーミッションはバックアップ先で600となるように指定します。

rsync -av --delete --chmod=600 .ssh ~

ssh設定の詳細

~/.sshディレクトリ

バックアップした/home/${USER}/.sshディレクトリは以下の構成であるとします。

ymmmtym@windows10:/mnt/c/Users/ymmmtym$ ls -l /home/${USER}/.ssh
-rw------- 1 ymmmtym ymmmtym   770 Jul  3 15:10 authorized_keys
-rw------- 1 ymmmtym ymmmtym  6608 Aug 10 13:09 config
-rw------- 1 ymmmtym ymmmtym  3326 Jul  3 15:10 id_rsa
-rw------- 1 ymmmtym ymmmtym   743 Jul  3 15:10 id_rsa.pub
-rw------- 1 ymmmtym ymmmtym 45573 Aug  7 17:04 known_hosts

~/.ssh/configファイル

/mnt/c/Users/${USER}/.ssh/configは以下の内容になっています。
vagrant上の2VMにログインする際のssh設定が記載してあります。

~/.ssh/config
Host centos
    User vagrant
    Hostname 192.168.0.3
    IdentityFile ~/.ssh/id_rsa

Host ubuntu
    User vagrant
    Hostname 192.168.0.4
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand ssh.exe -W %h:%p centos

一つ重要点として、ProxyCommandの記載がWindowsの記載であったとしても問題なくssh出来るということです。

ssh実行

ymmmtym@windows10:/mnt/c/Users/ymmmtym$ ssh ubuntu -vvv
OpenSSH_8.2p1 Ubuntu-4, OpenSSL 1.1.1f  31 Mar 2020
debug1: Reading configuration data /home/ymmmtym/.ssh/config
debug1: /home/ymmmtym/.ssh/config line 248: Applying options for ubuntu
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug2: resolve_canonicalize: hostname 192.168.211.4 is address
debug1: Executing proxy command: exec ssh.exe -W 192.168.211.4:22 centos
debug1: identity file /home/ymmmtym/.ssh/id_rsa type 0
debug1: identity file /home/ymmmtym/.ssh/id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4
Enter passphrase for key 'C:\Users\ymmmtym/.ssh/id_rsa':

内部的にWindowsでssh.exeが起動して、C:\Users\ymmmtym/.ssh/id_rsaを読み込んでくれます。
(通常のLinuxではこのような動作はしません)

~/.ssh/id_rsaを読み込みたい時は、~/.ssh/config以下のLinuxの場合に修正する必要があります。

~/.ssh/config
# Windowsの場合
    ProxyCommand ssh.exe -W %h:%p centos
# Linuxの場合
    ProxyCommand ssh -W %h:%p centos

実際に標準のLinuxで行った場合は以下のエラーが返されます。

vagrant@linux:~$ ssh ubuntu
bash: Unknown command 'ssh.exe -W 192.168.0.4 centos'
bash:
exec ssh.exe -W 192.168.0.4 centos
     ^
ssh_exchange_identification: Connection closed by remote host
vagrant@linux:~$

同期設定

ssh設定を頻繁に修正する方は、cronを使用して同期することをお勧めします。

Windows起動時にWSLでcronを起動する

sudo実行時にパスワードを聞かれないように設定する。

sudo usermod -G sudo ${USER}
sudo visudo

# 以下の記載になるように修正する
%sudo   ALL=(ALL:ALL) NOPASSWD: ALL

C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startupフォルダに、
以下のbatファイルを作成する。

wsl /bin/bash -l -c "sudo service cron start"

cronの設定をする

crontab -eを実行し、以下の行を追加する(以下は1時間毎に実行される例)

* */1 * * * /usr/bin/rsync -av --delete --chmod=600 .ssh ~

参考)

WSL で cron を利用する方法・Windows 起動時に自動実行する方法
同期設定(rsync)を今一度整理してみました

おまけ

rsyncやcronなどの面倒なことをせず単純に.sshディレクトリのコピーだけしたい場合は、
以下のコマンドを実行してください。

cp -r /mnt/c/Users/${USER}/.ssh /home/${USER}
chmod 700 ~/.ssh
chmod 600 ~/.ssh/*
chmod 644 ~/.ssh/*.pub
if [[ -f ~/.ssh/config ]]; then
  sed -i -e 's/ProxyCommand ssh\.exe /ProxyCommand ssh /g' ~/.ssh/config
fi
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4