2017-08-15 6 views
0

私はnetaddrからIPサブネット情報を生成するpythonスクリプトを持っています。スライスまたは配列のダイナミックレンジ

from netaddr import * 
ipnetwork = raw_input("Enter IP address: ") 
ip = IPNetwork(ipnetwork) 
print "Network ID:", ip.network 
print "Network Broadcast:", ip.broadcast 
print "Subnet Mask:", ip.netmask 
print "Prefix Length:", ip.prefixlen 
print "Wildcard Mask:", ip.hostmask 
print "Network Size:", ip.size 

print "Host range is:", ip[1], "-", ip[-2] 
for ip in IPNetwork(ipnetwork).iter_hosts(): 
    print '%s' % ip 

これは機能します。私が困っているところは、最初と最後の3つのアドレスを「予約」したいということです。ここに私の現在の出力の例です:

Enter IP address: 192.168.100.17/28 
Network ID: 192.168.100.16 
Network Broadcast: 192.168.100.31 
Subnet Mask: 255.255.255.240 
Prefix Length: 28 
Wildcard Mask: 0.0.0.15 
Network Size: 16 
Host range is: 192.168.100.17 - 192.168.100.30 
192.168.100.17 
192.168.100.18 
192.168.100.19 
192.168.100.20 
192.168.100.21 
192.168.100.22 
192.168.100.23 
192.168.100.24 
192.168.100.25 
192.168.100.26 
192.168.100.27 
192.168.100.28 
192.168.100.29 
192.168.100.30 

結果は、私は別のサブネットの長さを選択するまで、私はスライスが仕事だろうと思ったし、それがない

192.168.100.17 Reserved 
192.168.100.18 Reserved 
192.168.100.19 Reserved 
192.168.100.20 
192.168.100.21 
192.168.100.22 
192.168.100.23 
192.168.100.24 
192.168.100.25 
192.168.100.26 
192.168.100.27 
192.168.100.28 SW2-VLAN 100 
192.168.100.29 SW1-VLAN 100 
192.168.100.30 HSRP VLAN 100 

であるように私が持っているしたいと思いますどのような。最後のアドレスから3を引いたアドレス4(最初の予約されていないアドレス)を動的にスライスする方法を見つけることができません。私は、サブネットのサイズから最初と最後の3つのアドレスを差し引いたものに応じて動的である解決策(スライス、アレイ、インデックス)を見つけることができませんでした。どんな指針も大変ありがとうございます。

答えて

0

質問で少し混乱しています。 IPNetwork(ipnetwork).iter_hosts()を管理したい場合は、簡単にするために、リストを理解しておくといいでしょう。

def handle(i, data): 
    # Each ip, or 'data', can be returned as a 
    # new value to fill that list or we could return 
    # The objects themselves. 
    if i < 3: 
     return str(data) + " Reverse" 
    elif i > (total - 3): 
     return str(data) 
    else: 
     return str(data) + " SW1-VLAN 100" 

ips_to_manage = [handle(i, addr) for i, addr in \ 
       enumerate(IPNetwork(ipnetwork).iter_hosts())] 
for ip in ips_to_manage: 
    print '%s' % ip 

あなたは自分で合計を見つけなければなりません。 len(IPNetwork(ipnetwork).iter_hosts()) shoudはトリックをします。 この方法で、あなたが好きなように簡単に処理できます。

これは印刷しているだけですが、何か他の処理をしたい場合は、オブジェクト自体を返すようにしてください。

+0

返信いただきありがとうございます。あなたのコードを試しましたが、elifで構文エラーが発生しましたが、これは包括的なリストではサポートされていないようです。繰り返しをとり、文字列/配列/ dictに入れる別の方法はありますか? –

+0

この例では、elifはうまくいくはずです。私はあなたが実際にデータを扱うコードで各行の '#...'を置き換えたと仮定しています?あなたが得ている構文エラーは何ですか? – mccatnm

関連する問題