Windows10
BashOnUbuntuOnWindows

Bash on Ubuntu on Windows で sshd を使用する

追記: 2016-08-25T00:49

こちら でより使い勝手の良いターミナル環境の構築方法が紹介されています.


※ ここに記載してある内容は 2016/07/17 現在における Insider Preview の情報をもとに試したものです (ビルド番号は 14372.0)

動機

  • 256 色表示で Vim を動かしたい

    • 公式でサポートされるのは時間がかかりそう 対応されました
  • トリッキーなことをせず,chsh でデフォルトシェルを切り替えたい

    • .bashrc に変な設定を混入したくない

インストール

$ sudo apt-get install openssh-server

現状では特権分離 (privilege separation) に失敗するため,下のように設定を変更する.

/etc/ssh/sshd_config
UsePrivilegeSeparation no

また,ssh-copy-id などを用いて公開鍵を Bash on Windows 側に送るためにパスワードでのログインを有効にしておく 1

/etc/ssh/sshd_config
PasswordAuthentication yes

sshd の起動

Ubuntu とは異なり,インストール後に SSH がサービスとして登録されないため,bash.exe 実行毎に手動で起動する必要がある.

$ sudo service ssh start   # サービスとして起動する場合

また,bash.exe を終了すると Ubuntu 本体(/sbin/init)も終了してしまうため,bash.exe(を実行したコマンドプロンプト)を常駐させておく必要がある.

SSH サーバを常駐させる

SSH で接続するたびに サーバ用の bash.exe を起動するのは面倒なので,今回は(sshd 起動用の)bash.exe を常駐させる方針をとることにした.

Windows 側から sshd を起動するコマンドは次の通り.
サーバ起動後に終了コードが返ってくるのを防ぐため -D オプションをつけている.

sshd起動用のJScript
var ws = new ActiveXObject("WScript.Shell");
ws.Run("C:\\Windows\\System32\\bash.exe -c \"/usr/sbin/sshd -D\"", 0);

サービスとして登録しておいたほうがいい気もするが,面倒だったので今回は タスクスケジューラに登録する方針を採用した.
例えばログイン時に sshd を起動したい場合は次の通り.

admin
$ schtasks /create /tn "Start WSL Sshd" /tr c:\opt\start-wsl-sshd.js /sc onlogon

参考

  1. How to run sshd as a windows service ? · Issue #612 · Microsoft/BashOnWindows

  2. Linux: sshd デーモンの設定、開始・終了・再起動コマンド


※ コマンドプロンプト経由で SSH サーバを終了したい場合は次の通り.

C:\Windows\System32\bash.exe -c "kill `cat /var/run/sshd.pid`"

  1. コマンドプロントから type %userprofile%\.ssh\id_rsa.pub | bash -c 'tee -a ~/.ssh/authorized_keys' などとしたほうが楽かも