我列出了超过 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
感谢支持
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
感谢这个答案为我们指明了方向......