WSL Ubuntu上のサーバをWindowsから立ち上げる

前回の記事でWSLの環境セットアップ方法を記載しましたが、毎回Ubuntuを立ち上げてサーバを起動して…、

とやるのは面倒です。幸いWSLコマンドはWindowsコマンドプロンプトからでも実行できるため、これを利用して

サーバを楽に立ち上げられるようにします。

0. WindowsコマンドプロンプトからのWSL(Linux)コマンド実行

コマンドプロンプトを開き

 C:\Windows\System32\bash.exe -c 'コマンド'

もしくはbashがパスに入っていれば

 bash -c 'コマンド'

とするだけで、Linuxコマンドを実行することができます。

0.1 コマンドプロンプト文字コードUTF-8に変更する

Windowsコマンドプロンプト文字コードはデフォルトでCP932(シフトJIS)です。

UbuntuではUTF-8なので、文字化けする恐れがあります。以下のコマンドであらかじめ文字コードを変えておけます。

 chcp 65001

1. jupyter notebookの立ち上げ

↑で述べたことを利用して、

 C:\Windows\System32\bash.exe -c '~/.pyenv/versions/anaconda3-5.0.1/bin/jupyter notebook'

としてやれば、jupyter notebookが実行できます。

以下の点に注意してください。

・jupyter notebookのバイナリのアドレスを指定する必要がある

・実行ディレクトリがコマンドプロンプトのカレントディレクトリになる

2. sshdの立ち上げ

sshdの立ち上げにはsudoが必要です。bash.exeを直接叩くと

sudo権限では実行できないため、パスワードの入力が必要になります。

以下の2つの方法でこれを回避します。

2.1 コマンドプロンプトを管理者権限で立ち上げる

bashを実行するコマンドプロンプトを管理者権限で立ち上げておけば、

ここで実行するbash.exeはadmin権限(sudoとは異なる)で実行されるため、

sshdもそのまま立ち上げられます。

 C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'

一方、標準ではユーザーアカウント制御(UAC)で実行可否を聞かれることになります。

2.2 Ubuntu上で、sshd起動にはパスワードを不要にする。

以下をUbuntuで実行しておくことで、パスワード入力が不要になります。

 sudo visudo

を実行し、ファイル末尾に

 $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D

を追記します。ただし、$USERはWSLをインストールする際に作成したユーザ名に変更します。

3. 起動スクリプトの作成

2まででサーバが立ち上げられることが確認できました。この内容をスクリプトにして

ダブルクリックもしくはPC起動で立ち上がるようにします。

autostart.vbsというテキストファイルを作成し、以下を記述します。

set ws=wscript.createobject("wscript.shell")

ws.run "chcp 65001"

ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0

ws.run "C:\Windows\System32\bash.exe -c '~/.pyenv/versions/anaconda3-5.0.1/bin/jupyter notebook'",0

このautostart.vbsをダブルクリックするなりショートカットを作ってスタートアップに登録するなりしておけばOKです。

参考

WSL その50 - WindowsからLinuxコマンドを呼び出すコマンドの実行例

How to run Ubuntu service on Windows (at startup)?