2017-08-15 90 views
0

我有一個python腳本,它可以從netaddr生成IP子網信息。切片或陣列的動態範圍

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 

This works。我遇到麻煩的是我想「保留」第一個和最後三個地址。這裏是我的電流輸出的一個例子:

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 

我想切片會工作,這樣做,直到我選擇一個不同的子網長度。我無法知道如何動態地將地址四(第一個非保留)切片到最後一個地址減三。根據子網大小減去第一個和最後三個地址,我一直無法找到任何解決方案(slice,數組,索引)。任何指針將不勝感激。

回答

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())應該做的伎倆。 這樣,你可以隨心所欲地處理它們。

但是,這只是印刷他們,如果你想做別的事情,作爲對象本身的回報,你更受歡迎。

+0

感謝您的回覆。我嘗試了你的代碼,但是我在elif中得到了語法錯誤,看起來像在comprehend列表中不支持。是否有另一種方法來進行迭代並將其放入字符串/數組/字典中? –

+0

在這個例子中elif應該很好。我假設你用代碼來替換每一行上的'#...'來實際處理數據?什麼是你得到的語法錯誤? – mccatnm