前回まではWindows10 October 2018 UpdateのWSLにインストールしたDeibanの紹介をしてきました。
今回は残りの課題としてWSLのSSHをWindows起動時に自動実行する方法について紹介したいと思います。
WSL+SSHの課題
WSL (Windows Subsystem for Linux)は2018年4月のアップデートからバックグラウンドで動作するようになりました。
このためWSLにSSHサーバをセットアップしておくと、使いたいときにWindows上のSSHクライアント(例: PuTTY)でWSLに接続して利用することができます。
ところがWindows10を起動したあとに1回だけWSLを起動して手動でSSHサーバを起動する必要があります。
WSLのSSHの自動実行の方法
同じ不満を持っている方はいろいろいるようで、英語サイトではありますが議論されていました。
基本的にはWSLを実行するWSH(Windows Script Host)ファイルをWindowsの起動時に読み込ませて、WSLのSSHサーバを起動するようです。
今回はこの三番目の「wsl-autostart」というスクリプトを利用する方法を紹介します。wsl-autostartを使うと、SSHサーバ以外のソフトを自動起動でき、応用がききます。
wsl-autostartの導入
wsl-autostartを使うにはWindows上の設定とWSL上の設定の両方を行う必要があります。
Windows10での設定
まずwsl-autostartの一式をダウンロードしましょう。ファイルはGitHubで配布されています。
gitに慣れている方は「https://github.com/troytse/wsl-autostart」をcloneしてください。
gitに慣れていない方は左上の「Clone or download」でzipファイルをダウンロードできます。
ダウンロードしたファイルは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の設定画面を開きましょう。
そして「タスクスケジューラ」と入力すると「タスクのスケジュール」という項目が出ますのでこれを選択します。
これでタスクスケジューラが開きますので、一番左の欄で「タスクスケジューラライブラリ」を選択し、一番右の欄で「タスクの作成」を選択します。
「タスクの作成ウィンドウ」が開いたら「全般」タブでは、「名前」に「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のネットワークドライブを自動マウントする方法を考えます。
コメント