2017-02-08 1 views
0

Ich versuche, bestimmte IPv6-Bereiche mit CIDR-Notation in einen Bereich (first_address-last_address) in Powershell zu konvertieren, aber bin ein wenig distanziert.Parsing IPv6 CIDR in erste Adresse und letzte Adresse in Powershell

Eine Probe der Quelldaten:

2a01:111:f406:c00::/64 
2a01:111:f400:7c00::/54 
2a01:111:f403::/48 

Probe der erforderlichen Leistung (muss nicht genau sein, ich kann Schlamassel mit dem Format:

2a01:111:f406:c00::-2a01:111:f406:c00:ffff:ffff:ffff:ffff 
2a01:111:f400:7c00::-2a01:111:f400:7fff:ffff:ffff:ffff:ffff 
2a01:111:f403:0:0:0:0:0::-2a01:111:f403:ffff:ffff:ffff:ffff:ffff 

Ich habe ausführlich gegoogelt aber nichts gefunden, was mich in die richtige Richtung für Powershell gerichtet hat - ich habe ein PHP und JS Beispiel gefunden, aber nicht gut übersetzt.

Alle Zeiger?

Danke!

+0

ich würde empfehlen, beginnend mit „Normalisierung“ das Format der CIDR so gegeben, dass man ein festes Format hat - ‚unsuppress‘ führenden Nullen, und füllen Sie die Nullen aus, dass der :: Ersatz für. (Beispiel: '2a01: 111: f406: c00 ::/64' wird umgewandelt in' 2a01: 0111: f406: 0c00: 0000: 0000: 0000: 0000/64') Sobald Sie das haben, sollte es relativ sein einfach herauszufinden, wie Sie Ihren Zweck erreichen können. –

+0

Zusätzlicher Hinweis: Die Operatoren '-split' und '-f' könnten sich als nützlich erweisen. –

+0

@JeffZeitlin Danke, das ist eine machbare Lösung, aber ich bin besorgt über die Genauigkeit für alle Randfälle (es gibt 100+ in der Liste) –

Antwort

3

AFAIK, es gibt nichts in der BCL, die IPv6-Netzwerksegmente zu analysieren - ich IPNetwork library verwenden würde (funktioniert sowohl mit IPv4 und 6):

Add-Type -Path C:\path\to\System.Net.IPNetwork.dll 

# Parse ipv6/cidr string 
$Network = [System.Net.IPNetwork]::Parse('2a01:111:f400:7c00::/54') 

# Format string with first and last usable address 
$Range = '{0}-{1}' -f $Network.FirstUsable,$Network.LastUsable 
+0

Danke, das tut, was ich suche, im Idealfall möchte ich aus Gründen der Portabilität keine externe Bibliothek verwenden, aber es funktioniert ziemlich reibungslos. –

+0

Ein Hinweis für alle anderen, ich konnte die DLL nicht laden, bis ich folgte: http://StackOverflow.com/Questions/2094694/How-Can-Irun-Powershell-with-the-Net-4-Runtime –

+0

Verwenden Sie 'Unblock-File', um die Zonenanzeigen aus Dateien zu entfernen, die Sie aus dem Internet heruntergeladen haben –

0

ich damit endete, wo ipv6cidr $ ist ein Array von IPv6-Adressen in CIDR-Format ...

#convert IPv6 CIDR to IPv6 range 
[email protected]() 
foreach($ip in $ipv6cidr){ 
[email protected]() 
$netbits=$ip.Split("/")[1] 
$ip = $ip.Split("/")[0] 
$ip=$ip -replace '::','' 
$ip=$ip.Split(':') 
foreach($p in $ip){ 
$p='0x'+$p 
$bin=[Convert]::ToString($p, 2).PadLeft(16,'0') 
$binip+=$bin 
} 
$binip=$binip -join '' 
If($binip.Length -lt $netbitslength) 
{ 
$difference=$netbitslength-$binip.Length 
$missing= "1" * $difference 
[string]$missing=$missing 
$missing=$missing.Padleft(16,'0') 
$binip=$binip+$missing 
$binip=$binip -replace ',','' 
$binstart=$binip.PadRight(128,'0') 
$binend=$binip.PadRight(128,'1') 
} 
elseIf($binip.Length -gt $netbitslength){ 
$binstart=$binip.substring(0,$netbits).padright(128,'0') 
$binend= $binip.substring(0,$netbits).padright(128,'1') 
} 
[email protected]() 
While ($binstart) 
{ 
$x,$binstart= ([char[]]$binstart).where({$_},'Split',16) 
$startbin+=$x -join '' 
} 
[email protected]() 
foreach($start in $startbin){ 
$start=[Convert]::ToInt32("$start",2) 
$starts+='{0:X4}' -f $start 
} 
$finalstartip=$starts -join ':' 
[email protected]() 
While ($binend) 
{ 
$x,$binend= ([char[]]$binend).where({$_},'Split',16) 
$endbin+=$x -join '' 
} 
[email protected]() 
foreach($end in $endbin){ 
$end=[Convert]::ToInt32("$end",2) 
$ends+='{0:X4}' -f $end 
} 
$finalendip=$ends -join ':' 
$ipv6range+=$finalstartip+'-'+$finalendip 
}