将 IP 列表映射到子网列表 (cidr)

问题描述 投票:0回答:1

我列出了超过 3k 个 IP,需要将其映射到正确的子网 (cidr)。我已经创建了基本的 PS 脚本,但在某些情况下 IP 映射到两个或更多子网,这是不正确的。

看起来它仅适用于掩码为 /24 的子网,当我的掩码较低时,它会映射两个子网,如下例所示

abc         10.41.92.45     

Map too

10.41.92.0/29   sub1
10.41.92.40/29  sub2

以下任何人都可以帮忙

$SimpleSitelist = @(Import-csv -path C:\Users\ip\subnet.csv  )

#Site,CIDR
#Site1,192.168.1.0/24
#Site2,192.168.2.0/24
 
$SimpleHostList = @(Import-Csv -path C:\Users\ip.csv )

#hostname,ipaddress
#host1, 192.168.2.45
#host2, 192.168.1.45

foreach ($SingleHost in $SimpleHostList){
    $first, $second, $thrid, $4th = $SingleHost.IPAddress.split('.')
    $Sitetest = "{0}.{1}.{2}" -f $first, $second, $thrid
    [pscustomobject]@{
        Hostname  = $SingleHost.Hostname
        IPAddress = $SingleHost.IPAddress
        Site      = ($SimpleSitelist | where CIDR -match $Sitetest).Site
        Subnet      = ($SimpleSitelist | where CIDR -match $Sitetest).CIDR
        }
    }

数据示例

abc;10.41.92.45
xyz;10.188.2.48
abc1;10.248.232.5
aabb;151.156.179.145
         
sub1;10.41.92.0/29
sub2;10.41.92.40/29
sub3;10.188.2.0/24
sub4;10.248.232.0/21    
sub5;151.156.179.0/24

感谢支持

powershell subnet
1个回答
0
投票

很明显,dotnet core 有一个

System.Net.IPNetwork
结构,这比在 Uint32 中调整位要容易得多。

我们可以像这样设置您的样本数据:

$sites = @"
sub1;10.41.92.0/29
sub2;10.41.92.40/29
sub3;10.188.2.0/24
sub4;10.248.232.0/21    
sub5;151.156.179.0/24
"@ | convertfrom-csv -header @( "Name", "CIDR" ) -delimiter ";";

$hosts = @"
bc;10.41.92.45
xyz;10.188.2.48
abc1;10.248.232.5
aabb;151.156.179.145
"@ | convertfrom-csv -header @("Hostname", "IPAddress") -delimiter ";";

然后将 CIDR 范围解析为

IPNetwork
结构体:

# parse the cidr range text string for each site
$networks = $sites | foreach-object {
    $parts = $_.CIDR.Split("/");
    $network = new-object System.Net.IPNetwork(
        [System.Net.IPAddress]::Parse($parts[0]),
        [int]::Parse($parts[1])
    );
    [pscustomobject] @{
        "Site"    = $_
        "Network" = $network
    }
}

最后检查每个主机的网络成员资格:

$membership = foreach( $hostinfo in $hosts )
{
    $hostIpAddress = [System.Net.IPAddress]::Parse($hostinfo.IPAddress);
    $hostNetworks  = $networks | where-object { $_.Network.Contains($hostIpAddress) };
    [pscustomobject]@{
         "Hostname"  = $hostinfo.Hostname
         "IPAddress" = $hostinfo.IPAddress
         "Site"      = $hostNetworks.Site
         "Subnet"    = $hostNetworks.Site.CIDR
    }            
}

$membership

输出:

Hostname IPAddress       Site                                Subnet
-------- ---------       ----                                ------
bc       10.41.92.45     @{Name=sub2; CIDR=10.41.92.40/29}   10.41.92.40/29
xyz      10.188.2.48     @{Name=sub3; CIDR=10.188.2.0/24}    10.188.2.0/24
abc1     10.248.232.5    @{Name=sub4; CIDR=10.248.232.0/21 } 10.248.232.0/21
aabb     151.156.179.145 @{Name=sub5; CIDR=151.156.179.0/24} 151.156.179.0/24

感谢这个答案为我们指明了方向......

https://stackoverflow.com/a/63161497/3156906

© www.soinside.com 2019 - 2024. All rights reserved.