Home > Windows にまつわる e.t.c.

PowerShell で TCP/UDP ポート番号一覧 CSV を作る


以前からうちのサイトで TCP/UDP ポート番号一覧を公開しています。

TCP/IPポート番号一覧
http://www.vwnet.jp/mura/PortNumbers/tcpip-port.asp

 

当分更新していなかったので、たまにはメンテナンスをしようかと IANA のサイトを見ると、CSV/XML データーが提供されていました。

Service Name and Transport Protocol Port Number Registry
http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

 

以前はテキストデーターしか公開されていなかったので、チマチマ加工していたのですが、データーがあるのなら CSV への加工は簡単なので、TCP/UDP をサマって、ポート番号があるデーターだけの CSV にするスクリプトを書いちゃいました。(あまり必要のない項目は削除しています)

使い方は、以下を PowerShell プロンプトにコピペするだけです。(CSV to CSV)

# 必要に応じて変更
$CsvDataUrl = "http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.csv"
$WorkDirectory = "C:\Temp"
$DownloadFileNmae = "service-names-port-numbers.csv"
$PortNumbersCSVFileName = "PortNumbers.csv"

# tcp/udp をサマリーするフィルタ
filter SummaryTcpUdp(){
    BEGIN{
        # 初期値設定
        $InitFlag = $true
        $TCPFlag = $false
        $UDPFlag = $false
        $Reference = $null
    }

    PROCESS{
        # 初期処理
        if( $InitFlag -eq $true ){
            $NewKey = $_."Port Number"

            $NewRec = $_
            $InitFlag = $false
        }

        if( ($_."Port Number" -ne "") -and ($_."Port Number" -ne $null)){
            # 比較キーとデータセット
            $OldKey = $NewKey
            $OldRec = $NewRec

            $NewKey = $_."Port Number"
            $NewRec = $_

            # Reference
            if( ($_.Reference -ne "") -and ($_.Reference -ne $null)){
                $Reference = $_.Reference
            }

            # tcp/udp確認
            if( $NewRec."Transport Protocol" -eq "tcp" ){
                $TCPFlag = $true
            }
            elseif( $NewRec."Transport Protocol" -eq "udp" ){
                $UDPFlag = $true
            }

            # キーブレイク確認
            if( $OldKey -ne $NewKey ){
                # キーブレイクしたのでtcp/udpチェックしてデーター出力
                if( ($TCPFlag -eq $true) -and ($UDPFlag -eq $true )){
                    $OldRec."Transport Protocol" = "tcp/udp"
                }

                # Reference
                if( $Reference -ne $null ){
                    $OldRec.Reference = $Reference
                }

                $TCPFlag = $false
                $UDPFlag = $false
                $Reference = $null
                return $OldRec
            }
        }
    }

    END{
        # 残ったデーターを出力
        if( ($TCPFlag -eq $true) -and ($UDPFlag -eq $true )){
            $NewRec."Transport Protocol" = "tcp/udp"
        }

        if( $Reference -ne $null ){
            $NewRec.Reference = $Reference
        }

        return $NewRec
    }
}

# ワークディレクトリが無ければ作成
If( -not (Test-Path $WorkDirectory)){ md $WorkDirectory }

# データーを wget
$DownloadFile = Join-Path $WorkDirectory $DownloadFileNmae
wget $CsvDataUrl -OutFile $DownloadFile

# wget したデータ読み込み
$data = Import-CSV $DownloadFile

# データ部取り出し(プロトコル、ポート番号、name、description)
$ServicesData = $data | Select-Object "Transport Protocol", "Port Number", "Service Name", Description, Reference

# TCP/UDP をサマる
$PortNumbers = $ServicesData | SummaryTcpUdp

# CSV 出力
$PortNumbersCSV = Join-Path $WorkDirectory $PortNumbersCSVFileName
$PortNumbers | Export-Csv $PortNumbersCSV

# フォルダを開く
ii $WorkDirectory

 

 

XML から CSV 作る場合はこちら
(最初にこれ書いたのですが、CSV to CSV で良いじゃんと気が付きスクリプト書き直しました。折角書いたのを消すのも勿体無いので残しておきます w)

# 必要に応じて変更
$XmlDataUrl = "http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml"
$WorkDirectory = "C:\Temp"
$DownloadFileNmae = "service-names-port-numbers.xml"
$PortNumbersCSVFileName = "PortNumbers.csv"

# tcp/udp をサマリーするフィルタ
filter SummaryTcpUdp(){
    BEGIN{
        # 初期値設定
        $InitFlag = $true
        $TCPFlag = $false
        $UDPFlag = $false
    }

    PROCESS{
        # 初期処理
        if( $InitFlag -eq $true ){
            $NewKey = $_.number
            $NewRec = $_
            $InitFlag = $false
        }

        if( ($_.number -ne "") -and ($_.number -ne $null)) {
            # 比較キーとデータセット
            $OldKey = $NewKey
            $OldRec = $NewRec

            $NewKey = $_.number
            $NewRec = $_

            # tcp/udp確認
            if( $NewRec.protocol -eq "tcp" ){
                $TCPFlag = $true
            }
            elseif( $NewRec.protocol -eq "udp" ){
                $UDPFlag = $true
            }

            # キーブレイク確認
            if( $OldKey -eq $NewKey ){
                # キーブレイクしたのでtcp/udpチェックしてデーター出力
                if( ($TCPFlag -eq $true) -and ($UDPFlag -eq $true )){
                    $OldRec.protocol = "tcp/udp"
                }
                $TCPFlag = $false
                $UDPFlag = $false
                return $OldRec
            }
        }
    }

    END{
        # 残ったデーターを出力
        if( ($TCPFlag -eq $true) -and ($UDPFlag -eq $true )){
            $NewRec.protocol = "tcp/udp"
        }
        return $NewRec
    }
}

# ワークディレクトリが無ければ作成
If( -not (Test-Path $WorkDirectory)){ md $WorkDirectory }

# xml データーを wget
$DownloadFile = Join-Path $WorkDirectory $DownloadFileNmae
wget $XmlDataUrl -OutFile $DownloadFile

# wget したデータ読み込み
$data = [xml](Get-Content $DownloadFile)

# データ部取り出し(プロトコル、ポート番号、name、description)
$ServicesData = $data.registry.record | Select-Object protocol, number, name, description

# TCP/UDP をサマる
$PortNumbers = $ServicesData | SummaryTcpUdp

# CSV 出力
$PortNumbersCSV = Join-Path $WorkDirectory $PortNumbersCSVFileName
$PortNumbers | Export-Csv $PortNumbersCSV

# フォルダを開く
ii $WorkDirectory

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.