🐚

PowershellでhttpServer的なモノを作る(1)

2023/05/07に公開

Powershellで.netFrameworkのNet.HttpListenerを使用すれば、コンパイルせずにhttpserver的なものができます。業務に使えるかどうかは別としてserverの基本機能を順番に実装していきましょう。今回は、同じプライベート空間の別のPCからアクセスしようとして、はまったので作成行程を備忘録にします。

環境

  • OS環境はMicrosoft Windows10 Powershell 5.1
  • スクリプト編集は、Viusal Studio Codeもしくは、Windows PowerShell ISEを使用
  • ブラウザの確認環境はiPhone Chome

Net.HttpListenerの使用方法

まずもっとも短いNet.HttpListenerの使用方法です。

httpListener01.ps1
$listener = New-Object Net.HttpListener
$listener.Prefixes.Add("http://+:8888/")
try {
    $listener.Start()
    while ($true) {
        $context = $listener.GetContext()
        $content = [System.Text.Encoding]::UTF8.GetBytes('hello world!')
        $response = $context.Response
        $response.OutputStream.Write($content, 0, $content.Length)
        $response.StatusCode = 200
        $response.Close()
    }
}
catch {
    Write-Error($_.Exception)
}

ファイルを保存しカレントディレクトリでスクリプトを起動します

.\httpListener01.ps1

以下のエラーがでなければ、正しい動作しているはず

"0" 個の引数を指定して "Start" を呼び出し中に例外が発生しました: "アクセスが拒否されました。"

Powershell でListenポートの確認します。.\httpListener01.ps1が稼働したまま以下のコマンドを打ってみます。

Get-NetTCPConnection -State Listen | Select-Object -Property LocalAddress, LocalPort, State | Sort-Object LocalPort |ft

実行結果はこちらになります。ポート8888がすべてのListenになっていればOKです。

LocalAddress LocalPort  State
------------ ---------  -----
192.168.10.5       139 Listen
::                8888 Listen
...
0.0.0.0          49671 Listen
127.0.0.1        49720 Listen
127.0.0.1        50179 Listen
127.0.0.1        65001 Listen

次に外部端末のブラウザからコンテンツを確認できるようにWindows FireWallの設定に穴をあけます。管理者用Powershellを開き以下のスクリプトをいれます。OutBoundは解放されているので不要です。

New-NetFirewallRule -DisplayName "WebServer(8888)" -Direction Inbound -Protocol TCP –LocalPort 8888 -Action Allow

外部端末のブラウザを起動し.\httpListener01.ps1を起動しているアドレスを入れます。今回の場合は、http://アドレス:8888といれhello world!と表示されれば、外部のブラウザでの確認が完了です。

Discussion