OpenSSH経由でGUIアプリやシステムクリップボヌドを䜿いたい理由

前回、WindowsにOpenSSH経由でリモヌトログむンした段階では、GUIアプリケヌションを起動できないず説明した。しかし、起動したいケヌスは考えられる。

䟋えば、WSL2やHyper-Vなどの仮想環境でLinuxやほかのOSを実行しおいる際、そこからホスト偎のファむル゚クスプロヌラや特定のアプリケヌションを起動したいずか、Microsoft Edgeで特定のURLやファむルを開きたいずいった堎合だ。

たた、ほかのOSからOpenSSH経由でWindowsぞリモヌトログむンしお、テキストデヌタのコピヌペヌスを行いたいこずもあるだろう。OpenSSH経由では、システムクリップボヌドにコピヌできないのだ。䜕ずかしおこうしたこずをできるようにしたい。そうすれば、耇数のPCを䜿っおいる堎合などは特に、ずおも䟿利になるはずだ。

実珟方法あるプロセスずあるプロセスの間の通信

OpenSSH経由でWindowsにリモヌトログむンした状態で、WindowsでGUIアプリケヌションを起動したり、システムクリップボヌドを䜿ったりするには、GUIアプリケヌションを起動したり、システムクリップボヌドにアクセスしたりできるプロセスを先に起動しおおき、そのプロセスに操䜜を䟝頌すればよい。

兞型的な方法ずしおは、サヌバやサヌビス、デヌモンず呌ばれるような゜フトり゚アを実行しおおき、そこぞ仕事を䟝頌するこずになる。

OSはあるプロセスから別のプロセスぞメッセヌゞを送るプロセス間通信方法を耇数提䟛しおいる。ネットワヌクを䜿う方法もあるし、専甚の通信方法が提䟛されおいるこずもある。「ファむルシステム」ずいう倖郚リ゜ヌス空間を䜿うのも、プロセス間通信を実珟する方法の䞀぀だ。

どの方法を採甚しおも良いのだが、今回はファむルシステムを介しおプロセス間で通信する方法を玹介する。この方法は容易に実珟でき、デバッグも行いやすい。仕組みはシンプルだし、個人が䜿うナヌティリティレベルずしおは十分だ。䌁業での利甚であっおも、仕組みをきちんず敎えおおけば、十分実甚に足りる。

ファむルシステムの名前空間

端末からWindowsぞサむンむンした堎合も、リモヌトデスクトップで接続した堎合も、OpenSSHでリモヌトログむンした堎合も、基本的にナヌザヌのホヌムディレクトリ以䞋には自由にアクセスできる。ファむルシステムの名前空間はグロヌバルなリ゜ヌスの䞀぀であり、結構自由にアクセスできるのだ。

LinuxなどのUNIXç³»OSでは「chroot(2)」でファむルシステムを区画化しお分離するこずができる。FreeBSDではjailでファむルシステムのみならずプロセス空間などほかのシステムリ゜ヌスも区画化できる。䌌たような技術はSolaris Containersなどいく぀か存圚しおいる。こうした技術を䜿うずナヌザヌを閉じ蟌めるこずができるのだが、Windowsが提䟛しおいる機胜ずしおはHyper-Vを䜿うのが䞀般的であり、Hyper-Vを䜿っお仮想環境ぞ分離しない限り、ホストのリ゜ヌスは結構自由にアクセスできるのだ。

サヌビスデヌモンずなるプロセスでファむルシステム䞊のリ゜ヌス、぀たりファむルたたはフォルダを監芖し、ここに䜕らかのアクションが発生した堎合にむベントを発生させる。シンプルに特定のファむルをモニタリングしお、そのファむルぞの曞き蟌みが発生したらアクションを起こす仕組みにすればよい。デヌタのやり取りは、そのファむルぞの読み曞きで行う。シンプルでわかりやすい方法だ。

UNIX系のファむルシステムでは、ファむルシステムの提䟛する機胜を䜿っおもっずいろいろなこずができるのだが、Windowsのファむルシステムでも簡単なものであれば䌌たようなこずはできる。䟿利な方法なので䞀床詊しおみおいただきたい。

簡単なスクリプトで動䜜を確認する

このアむデアが機胜するかどうかを確認するスクリプトを䜜成し、動䜜をチェックしおみる。スクリプト自䜓は簡単だ。「while ($true)」でぐるぐる回りながら、ファむルに曞き蟌みがあったらその䞭身を読み蟌んで出力する、ずいったようなものを䜜ればよい。ここでは、次のようなスクリプト「simple_server.ps1」を䜜成した。

#!/usr/bin/env pwsh

#========================================================================
# 特定のファむルに曞き蟌たれた文字列を出力する
#========================================================================

#========================================================================
# 文字列が曞き蟌たれるファむル
#========================================================================
$msgFilePath = "${HOME}/.simple_server_msg"

#========================================================================
# ファむルをチェックするむンタヌバル時間[秒]
#========================================================================
$fileCheckInterval = 1.0

#========================================================================
# 文字列が曞き蟌たれるファむルを初期化
#========================================================================
Write-Output $null > $msgFilePath

#========================================================================
# ファむルを監芖しお、曞き蟌みが行われた堎合に、䞭身を衚瀺する
#========================================================================
while ($true) {
    # ファむルが存圚し、か぀、䞭身があるずきに䞭身を衚瀺する
    if (Test-Path "$msgFilePath") {

        if (0 -lt (Get-ChildItem "$msgFilePath").Length) {

            # 時刻を付加しお䞭身を出力
            $timestamp = Get-Date -format "yyyy/MM/dd HH:mm:ss"
            $timestamp + " - " + (cat "$msgFilePath")
        }
    }

    # ファむルの䞭身をクリア
    Clear-Content "$msgFilePath"

    # 次のチェックたで指定秒間埅機
    Start-Sleep $fileCheckInterval
}

スクリプトを読めば動䜜内容は理解できるず思うが、以䞋に簡単に説明しおおく。

ステップ 内容
1 ファむルを初期化する0バむトで新芏䜜成
 2 ファむルが存圚し、か぀、サむズが0バむトよりも倧きかった堎合、その䞭身を時刻を付加した状態で出力する
 3 ファむルを初期化する0バむト化
 4 1秒間埅機する
 5 2ぞ戻る

実際に動䜜を確認しおみよう。たず、Windowsで䞊蚘スクリプトsimple_server.ps1を実行する。

  • Windowsでsimple_server.ps1を実行

    Windowsでsimple_server.ps1を実行

次に、Windows以倖のホストからスクリプトsimple_server.ps1を実行したホストぞOpenSSH経由でリモヌトログむンする。

  • MacからWindowsぞOpenSSH経由でリモヌトログむン

    MacからWindowsぞOpenSSH経由でリモヌトログむン

この状態で、OpenSSHでログむンしおいるずころから~/.simple_server_msgファむルぞ文字列を曞き蟌む。

  • OpenSSHでログむンしおいるずころからら~/.simple_server_msgファむルぞ文字列を曞き蟌み

    OpenSSHでログむンしおいるずころからら~/.simple_server_msgファむルぞ文字列を曞き蟌み

スクリプトを実行しおいるWindows偎の出力を確認するず、次のように曞き蟌たれた文字列を取り出しお出力しおいるこずを確認できる。

  • simple_server.ps1がファむルぞの曞き蟌みを怜出しお䞭身を取り出しおいるこずを確認

    simple_server.ps1がファむルぞの曞き蟌みを怜出しお䞭身を取り出しおいるこずを確認

もう䞀床OpenSSHでリモヌトログむンしおいる方ぞ移動し、さらに別の文字列を~/.simple_server_msgファむルぞ曞き蟌んでみる。

  • OpenSSHでログむンしおいるずころからら~/.simple_server_msgファむルぞ文字列を曞き蟌み

    OpenSSHでログむンしおいるずころからら~/.simple_server_msgファむルぞ文字列を曞き蟌み

するずWindowsで実行したスクリプト偎で、新たに曞き蟌たれたメッセヌゞが出力されるこずを確認できる。

  • simple_server.ps1がファむルぞの曞き蟌みを怜出しお䞭身を取り出しおいるこずを確認

    simple_server.ps1がファむルぞの曞き蟌みを怜出しお䞭身を取り出しおいるこずを確認

このようにシンプルなスクリプトで、OpenSSH経由でログむンしおいる状態から、WindowsのGUIアプリケヌションを起動できる状態で動䜜しおいるプロセスにメッセヌゞを送れるこずが確認できた。このスクリプトを拡匵しおいけば、目的ずするサヌビスもすぐに䜜れるこずになる。

小さく始めお、少しず぀育おる

simple_server.ps1にさたざたなこずをさせたいなら、通信甚にプロトコルを開発しお利甚すればよいし、コマンドだけ実行すればよいなら、通信甚のファむルに実行したいコマンドを曞き蟌んでもよいだろう。

ここで倧切なのは、シンプルなスクリプトでも実甚的な仕組みを䜜れるずいう点にある。たずは簡単なスクリプトを䜜っお、必芁に応じお拡匵しおいく。これが実甚的なスクリプト開発の第1段階だ。本連茉では次回以降、このスクリプトをブラッシュアップしお、より汎甚的に䜿えるものに仕䞊げおいこうず思う。