DebianをWindows10上で動かす その9: WSLのSSHを自動実行する

前回まではWindows10 October 2018 UpdateのWSLにインストールしたDeibanの紹介をしてきました。

今回は残りの課題としてWSLのSSHをWindows起動時に自動実行する方法について紹介したいと思います。

WSL+SSHの課題

WSL (Windows Subsystem for Linux)は2018年4月のアップデートからバックグラウンドで動作するようになりました。

このためWSLにSSHサーバをセットアップしておくと、使いたいときにWindows上のSSHクライアント(例: PuTTY)でWSLに接続して利用することができます。

今回はWindows Subsystem for Linux上のDebianにSSHサーバを導入して、SSHで接続できるようにします。これで使い慣れたターミナルソフトPuTTYを使ってWSLを操作できるようになります。ただ、Windows10の起動時に1回だけ手動でSSHサーバを起動しておかなければ行けません。自動的にSSHサーバを実行する方法があるようなので、それは別の機会に挑戦したいと思います。

ところがWindows10を起動したあとに1回だけWSLを起動して手動でSSHサーバを起動する必要があります。

WSLのSSHの自動実行の方法

同じ不満を持っている方はいろいろいるようで、英語サイトではありますが議論されていました。

I want to launch an SSH server on Linux subsystem (Bash on Ubuntu on Windows) at windows startup. The problem is that all Linux processes are terminated when Ba...
A step by step tutorial on how to automatically start ssh server on boot on the Windows Subsystem for Linux - WSL-ssh-server.md
Support for starting the Linux services in Windows Subsystem for Linux (WSL) on Windows startup - troytse/wsl-autostart

基本的にはWSLを実行するWSH(Windows Script Host)ファイルをWindowsの起動時に読み込ませて、WSLのSSHサーバを起動するようです。

今回はこの三番目の「wsl-autostart」というスクリプトを利用する方法を紹介します。wsl-autostartを使うと、SSHサーバ以外のソフトを自動起動でき、応用がききます。

wsl-autostartの導入

wsl-autostartを使うにはWindows上の設定とWSL上の設定の両方を行う必要があります。

Windows10での設定

まずwsl-autostartの一式をダウンロードしましょう。ファイルはGitHubで配布されています。

Support for starting the Linux services in Windows Subsystem for Linux (WSL) on Windows startup - troytse/wsl-autostart

gitに慣れている方は「https://github.com/troytse/wsl-autostart」をcloneしてください。

gitに慣れていない方は左上の「Clone or download」でzipファイルをダウンロードできます。

wsl-autostart

ダウンロードしたファイルはWindows10で展開して適当なフォルダに内容を展開します。私は「c:\wsl-autostart」に保存しました。

まずwsl-autostartに含まれているcomands.txtを編集して、自動実行したいコマンドを記載します。私はsshサーバとcronを実行したかったので次のような内容としました。

/etc/init.d/ssh
/etc/init.d/cron

なお「start.vbs」を実行するとこのファイルを1行ずつ読み込み最後に「start」つけて実行し、「stop.vbs」を実行すると1行ずつ読み込み最後に「stop」をつけて実行します。command.txtにはこれを考慮してコマンドを記述しましょう。

sshサーバなどの起動にはserviceコマンドを使った方が良いと思われるかもしれません。

しかし、commands.txtで指定したコマンドはWSL内でパスワードなしでsudoで実行できるようにする必要があります(後述)。

serviceコマンドをパスワード不要にしてしまうと、ssh・cron以外のサーバを不用意に操作してしまう可能性が出てきます。

そこで今回はssh・cronを個別のコマンドで起動できるようにし、パスワード不要にするのも個別のコマンドのみにしています。

次にstart.vbsが自動起動するように設定します。これがちょっとやっかいです。start.vbsのショートカットをスタートアップフォルダに作っても良いのですが、毎回Windowsが警告を出してきて鬱陶しいのです。

そこでタスクスケジューラから起動するようにしましょう。

スタートメニューから「設定 (歯車アイコン)」を選択してWindowsの設定画面を開きましょう。

そして「タスクスケジューラ」と入力すると「タスクのスケジュール」という項目が出ますのでこれを選択します。

Windowsの設定

これでタスクスケジューラが開きますので、一番左の欄で「タスクスケジューラライブラリ」を選択し、一番右の欄で「タスクの作成」を選択します。

タスクスケジューラ

「タスクの作成ウィンドウ」が開いたら「全般」タブでは、「名前」に「wsl-autostart」と入力します。また下の方にある「最上位の特権で実行する」にチェックを入れておきます。

タスクの作成

次に「トリガータブ」を選び「新規」ボタンを選択します。

タスクの作成 - トリガータブ

これで「新しいトリガーウィンドウ」が開くので「タスクの開始」で「ログオン時」を選択して「OK」を選びます。

新しいトリガーの作成

「タスク作成のウィンドウ」に戻ったら「操作タブ」を選び「新規」ボタンを選択します。

タスクの作成 - 操作タブ

これで「新しい操作ウィンドウ」が開くので、「操作」で「プログラムの開始」を選択します。そして「プログラム/スクリプト」の欄でwsl-autostartについてきた「start.vbs」を選択します。

新しい操作の作成

OKを選択して「タスクの作成ウィンドウ」に戻ったらもう一度「OK」を選択してタスクを登録します。

これでWindows側の設定は完了です。

次回のログオン時に自動的にstart.vbsが実行され、start.vbsによって指定したWSLのコマンドも自動実行されるようになります。

WSLでの設定

WSL側では先ほど「command.txt」に記載したコマンドをパスワードなしでsudoで実行できるようにしておきます。

WSLの「/etc/sudoers.d」に「wsl-start」という名前のファイルを作成します。

$ sudo vi /etc/sudoers.d/wsl-start

内容は次のようにします。

%sudo ALL=NOPASSWD: /etc/init.d/ssh
%sudo ALL=NOPASSWD: /etc/init.d/cron

最後に作成したファイルのパーミッションを「0440」に変更します。

$ sudo chmod 0440 /etc/sudoers.d/wsl-start

これで設定完了です。

動作確認

それでは動作確認をしてみましょう。

Windows10を再起動(シャットダウンではなく、必ず再起動をしましょう)していつものユーザでログオンしましょう。

ログオンに成功したらタスクバーを右クリックして「タスクマネージャ」を表示させます。

「プロセスタブ」で「sshd」というプロセスがあれば成功です。

タスクマネージャ

最後にPuTTYなどのSSHクライアントでWSLに接続できることを確認しましょう。

まとめ

今回はWSLのSSHサーバをWindows10へのログオン時に自動実行する方法を紹介しました。

これで手動でSSHサーバを起動する必要がなくなり、いきなりSSHクライアントでWSLに接続することができるようになりました。コマンドライン派にはかなり便利な状況ではないでしょうか。

今回紹介した手法はSSHサーバだけでなく、Webサーバなどの様々なWSL上のサーバに応用できますので活用してみてください。

次回はWindowsのネットワークドライブを自動マウントする方法を考えます。