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
|
Copyright © MURA
All rights reserved.