苦労して構築する Windows10 + WSL2 + Visor ターミナル環境


はじめに

Windows のターミナル環境は選択肢が多くて、業務だと TeraTerm や PuTTY あたりがよく使われていると思うけれど、他にも多数( Rlogin, Poderosa, Hyper, mRemoteNG, etc... )のターミナルエミュレータが存在するし、最近は Microsoft 純正の Windows Terminal というのも出ているよね。

個人用途ではターミナルは PuTTY を使い続けてきて、最近は Mac の iTerm2 の使用感に近付けている。

  • ホットキーでターミナルを Visor 表示できる。
  • ターミナルを立ち上げると WSL2 環境のシェル ( zsh ) が立ち上がる。
  • ウィンドウは透過させて、タブもある。

みたいな感じ。

Visor とは

Visorと言っているのは、こういう挙動のこと。

最近は「Quake-style」と呼ぶみたい。

ホットキーを押下するとターミナルの表示/非表示を切り替えられる。これが、頻繁にターミナルと他のアプリケーションを行き来する時(Webで調べながらCUI作業するとか)なんかには、めちゃ便利なわけ。

準備するもの

  • Windows 10 Pro 64bit
  • Ubuntu on WSL2
  • ConEmu
  • PuTTY
  • AutoHotkey

Visor するだけなら ConEmu だけでいい。

これに加え、ぼくの場合は

  • cmd.exe や PowerShell ではなく WSL2 のシェルを立ち上げるために WSL2Ubuntu
  • さらに、普段の使用感(フォントとか)で操作するために PuTTY
  • さらに、ConEmu が起動していない時でもホットキーで ConEmu を呼び出すために AutoHotkey

を組み合わせて使っている。

ConEmu

  • ConEmu
    ( 想定のインストール先:C:\App\ConEmu\ConEmu64.exe )

タブ付きターミナルエミュレータ。Quake style として、Visor の機能が搭載されている。
ターミナルエミュレータの中では自由度が高く、かなり細かくカスタマイズができる。

ここまで読んで ConEmu だけでいいや!って人は Cmder の方がオススメかも。

WSL2 + Ubuntu

WSL2 環境を有効に出来たら Microsoft Store で Ubuntu をインストールする。

PuTTY

  • PuTTY => iceiv+putty
    ( 想定のインストール先:C:\App\PuTTY\putty.exe )

昔から好きで使っているのだけれど、不満はある。

  • UTF-8 の Emoji がまともに表示できない。
  • 端末タイプとキー割り当ての対応がおかしい?

PuTTY で SSH 設定の端末タイプを xterm-256color にして ssh -> zsh -> ( tmux -> ) neovim とした環境だと Home, End が期待通りに動作しなくて、screen-256color にすると期待通りに動作する。
(環境が複雑すぎて原因の切り分けができない…)

という挙動があって、PuTTY 自身はターミナルマルチプレクサでも無いのに今は screen-256color を指定して使っている。この状態には違和感があるし、なにより対応する zsh 側の設定が気持ち悪くなる。

この件については今回は無視する。

AutoHotkey

Powerful. Easy to learn.
The ultimate automation scripting language for Windows.

こいつがあればキーボードだけで生きていける。

各種設定

さあ、ここからが本番だ。

PuTTY

iceiv 版の PuTTY をダウンロードしたなら、ja-JP の中の *.lng ファイルを putty.exe と同じフォルダにコピーすると日本語になるよ。

以降の画像は日本語化前の英語表記のものです。

  1. puttygen.exe を実行。
  2. Ubuntu には公開鍵認証方式でSSHログインしたいので、鍵を生成するよ。
    今回はちょっと意識高く ECDSA 521bit を選んで、「Generate」をクリック。
  3. カーソルをグルグル動かすと生成が進む。
  4. 公開鍵を生成する。
  5. ファイル名は「id_ecdsa.pub」とでもしておく。
  6. 秘密鍵を生成する。
  7. 警告が出るが、「はい」でOK。今回は「パスフレーズ無し」で鍵を作る。
  8. ファイル名は「id_ecdsa.ppk」とでもしておく。
  9. ウィンドウ右上の「☓」をクリックして閉じる。

次!

  1. putty.exe を実行。
  2. Connection > SSH > Auth を開いて、秘密鍵として先ほど生成した id_ecdsa.ppk を指定する。
  3. Connection > Dataユーザ名に Ubuntu をインストールした時に指定したユーザ名を入れる。 ぼくの場合は諸事情で端末タイプを「screen-256color」というものに変更しているけれど、詳しくはググってくれ!
  4. Session で、接続先を 127.0.0.1、設定名を wsl で、保存する。
  5. ウィンドウ右上の「☓」をクリックして閉じる。

次!

ConEmu

ホットキーは「左Win + 半角/全角」にするよ

  1. ConEmu64.exe を実行。

  2. 「OK」をクリック。

  3. こんなウィンドウが表示されたら、「Win + Alt + P」で設定画面を出す。

  4. Startup > Tasks と進んで、PuTTY用の設定を追加する。(並び順は何でもOK)

  5. Features > Transparency と進んで、ウィンドウ透過を有効にする。

  6. あとは関係ありそうな設定画面をそのまま貼っていく。(適宜自分好みに変えてください。)




  7. 「Save settings」をクリックして閉じる。

  8. ウィンドウ右上の「☓」をクリックして、一度 ConEmu を終了させる。

  9. C:\App\ConEmu\ConEmu.xml が生成されているので、サクラエディタか何かで開く。


    45行目辺りにある、

    • MinimizeRestore の値を 00005bf4
    • MinimizeRestore2 の値を 00005bf3

    に、それぞれ書き換えて保存する。

次!

WSL2 + Ubuntu (前半)

  1. WSL2 でインストールした Ubuntu を起動する。

  2. 管理者権限に昇格して SSHサーバ(openssh-server パッケージ)をインストールする。

    $ sudo su -
    # apt update && apt install openssh-server
    
  3. 作業ユーザで sudo する際のパスワード確認を省略するように設定する。

    # EDITOR=vim visudo
    
    .. (以下を変更。「%sudo」の行に「NOPASSWD: 」を追記して保存する。)
    %sudo>--ALL=(ALL:ALL) ALL
    ↓
    %sudo>--ALL=(ALL:ALL) NOPASSWD: ALL
    
  4. SSHサーバで公開鍵認証を有効にする。

    # cd /etc/ssh/
    # ssh-keygen -A
    # vim sshd_config
    
    .. (以下を変更。2箇所のコメントアウトを外して保存する。)
    #PubkeyAuthentication yes
    ↓
    PubkeyAuthentication yes
    ..
    #AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
    ↓
    AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
    
  5. 設定反映のため、SSHサーバを再起動して、管理者権限を抜ける。

    # service ssh restart
    # exit
    
  6. ユーザ権限に戻ったら、PuTTY から公開鍵認証でログインできるようにする。
    前準備として puttygen.exe を起動して、File > Load private key から先ほど生成した秘密鍵(id_ecdsa.ppk)を開いて、画像の赤い囲い部分のテキスト(公開鍵)をコピーする(改行されて見えるけれど、コピーすると1行だよ!)。

    公開鍵をコピーしたらコマンド入力に戻って、公開鍵をサーバ上に登録する。

    $ cd
    $ mkdir .ssh/
    $ chmod 700 .ssh/
    $ touch .ssh/authorized_keys
    $ chmod 600 .ssh/authorized_keys
    $ vim .ssh/authorized_keys
    .. (コピーしためちゃ長い公開鍵1行分を追記して保存する。)
    ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1M...== ecdsa-key-20200912
    
    
  7. 一旦サーバから抜ける。

    $ exit
    

サーバ上の作業終わり!
次!

WSL2 + Ubuntu (後半)

ここまでの設定では WSL の仕様で Windows を再起動しても sshd が自動で立ち上がらない。
なので、以下の手順で Windows 起動時に Ubuntu の sshd を起動するように設定する。

  1. 以下の内容で C:\App\startup_for_wsl.ps1 を作成。

    startup_for_wsl.ps1
    $wsl_is_available = $FALSE
    
    while( ! $wsl_is_available )
    {
        ubuntu.exe run sudo service ssh restart
        $wsl_is_available = $?
        if( $wsl_is_available ) {
            break
        }
        else {
            Start-Sleep -Seconds 5
        }
    }
    

    ubuntu.exe に関しては Microsoft Store で

    • Ubuntu をインストールした人は ubuntu.exe のまま。
    • Ubuntu 18.04 をインストールした人は ubuntu1804.exe
    • Ubuntu 20.04 をインストールした人は ubuntu2004.exe

    に適宜読み替えてください。

  2. Winキー + Rキー でファイル名を指定して実行で「shell:startup」を開く。

  3. 何もないところを右クリック -> 新規作成 -> ショートカット、「項目の場所」として

    %SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\App\startup_for_wsl.ps1
    

    を指定して「次へ」、適当に名前を付けて「完了」。

※ 改めて調べていたら WSL2 からはこんなことしなくても、systemd を PID 1 で動かすハックが存在するみたい

AutoHotkey

ホットキーは「左Win + 半角/全角」とする。
AutoHotkey上では

  • LWin が「左Windowsキー」
  • vkf4 が「半角/全角キー」

を意味する。

  1. 以下の内容で C:\App\AutoHotkey\MyHotkey.ahk を新規作成。

    MyHotkey.ahk
    #WinActivateForce
    #HotkeyInterval 2000
    #HotkeyModifierTimeout 100
    #MaxHotkeysPerInterval 100
    #InstallKeybdHook
    #UseHook
    
    ; ConEmu
    LWin & vkf4::
    Process, Exist, ConEmu64.exe
    if ErrorLevel <> 0
    {
        IfWinActive, ahk_class VirtualConsoleClass
        {
            Send, #{vkf4}
        }
        else
        {
            IfWinExist, ahk_class VirtualConsoleClass
            {
                WinActivate, ahk_class VirtualConsoleClass
            }
            else
            {
                Send, #{vkf4}
                WinActivate, ahk_exe ConEmu64.exe
            }
        }
    }
    else
    {
        run, C:\App\ConEmu\ConEmu64.exe, C:\App\ConEmu
    }
    return
    
    
  2. AutoHotkey 自体にスタートアップで起動する機能は無いので、タスクスケジューラで設定する。
    スタートメニューから「タスクスケジューラ」を起動する。

  3. 左ペインの「タスクスケジューラ ライブラリ」を右クリックして「新しいフォルダー(N)」で
    「App」とか適当に作成して、右ペインの「タスクの作成」をクリック。

  4. 名前に「AutoHotkey」、お好みで「最上位の特権で実行する」にチェック。

  5. トリガータブに移って、「新規」をクリック。

  6. 上部のプルダウンを「ログイン時」に変更して、「OK」をクリック。

  7. 操作タブに移って、「新規」をクリック。

  8. それぞれ以下のように入力して、「OK」 をクリック。

    • プログラム/スクリプト(P):C:\App\AutoHotkey\AutoHotkeyU64.exe
    • 引数の追加 オプション(A):C:\App\AutoHotkey\MyHotkey.ahk
    • 開始 (オプション)(T): C:\App\AutoHotkey
  9. 条件タブに移って、「AC電源で使用している場合のみ」のチェックを外す。

  10. 設定タブに移って、「タスクを停止するまでの時間」のチェックを外して、OKをクリック。

  11. あとちょっとだ!
    AutoHotkeyのタスクが保存されていることを確認して、右ペインの「実行」をクリック!

動作確認

長かった!
ここまで正しく設定されていれば、「左Winキー + 半角/全角キー」をホットキーとして ConEmu のターミナルが現れたり消えたりするはずだ!
しかも、PuTTY を通じて WSL2環境の Ubuntu のシェルが表示されているはずだ!
それに、Windows を再起動しても何もしなくてもホットキーは動作するはずだ!
ヤッター!

さいごに

スクリーンショットに写っている秘密鍵/公開鍵に関しては、破棄しており実際には使用していないのでご心配なく。