💻

任意のポート番号で待ち受けるPowerShellスクリプト

2024/09/22に公開

はじめに

サーバへの疎通確認用として、簡易的に特定のポートで待ち受けるPowerShellスクリプトを作りました。

スクリプト

SimpleServer.ps1
param (
    [int]$Port = 12345  # デフォルトポート番号を指定
)

try {
    # ポートでリスナーを作成(全インターフェースにバインド)
    $listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Any, $Port)
    $listener.Start()

    Write-Host "Listening on all interfaces on port ${Port}... Press Ctrl+C to stop."

    while ($true) {
        # クライアントの接続を非同期で待機
        if ($listener.Pending()) {
            $client = $listener.AcceptTcpClient()
            Write-Host "Client connected from $($client.Client.RemoteEndPoint.Address):$($client.Client.RemoteEndPoint.Port)!"

            # クライアントからの接続をクローズ
            $client.Close()
            Write-Host "Client connection closed."
        }

        # サーバが過負荷にならないように短い休止を追加
        Start-Sleep -Milliseconds 100
    }

} catch {
    Write-Error "An error occurred: $_"
} finally {
    # Ctrl+Cが押された場合のクリーンアップ
    $listener.Stop()
    Write-Host "Server stopped."
}

使い方

サーバ側

オプション-Portで、対象のポート番号を指定します。指定しない場合は12345になります。

.\SimpleServer.ps1 -Port 9898

複数のポートで待ち受けたい場合は、複数実行します。

停止する場合は、Ctrl+Cを入力します。

クライアント側

PowerShell標準のTest-NetConnectionで確認できます。

Test-NetConnection -ComputerName [IPまたはホスト名など] -Port 9898

結果は以下のようになります。

おわりに

今回は、ncコマンドの代わりになるようなPowerShellスクリプトを作りました。
ncコマンドのEXEを使おうとしたのですが脅威検知され使えなかったので、簡易的なものですが作ってみました。
PowerShellスクリプトなので、社内のセキュリティでも検知されず問題なく使えそうです。
この記事がどなたかのお役に立てれば幸いです。

Discussion