2017-04-25 9 views
0

シスコルータにコマンドを実行し、IPのリストをテキストファイルに書き込むプログラムを作成しようとしています。すべてのIPをファイルに書き込んだ後、すべてのIPを正常に取得できます。今私が困っている部分は、リストからどれだけのIPを得るのか分からないということです。ファイルから取得した各IPをユーザー定義のIPと比較したいので、IPの数に基づいて動的変数を作成するか、またはすべてのIPを繰り返してユーザーのIPと比較する方法が必要です。リスト/アレイのlenに基づいて動的変数を作成する

import re 
import ipaddr 

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:') 
ipFile = ("router.com.txt") 
found = [] 
with open(ipFile, 'r') as f: 
    for text in f.readlines()[1:]: #File had a blank line so this skips it 
     text = text.rstrip() 
     regex = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text) 
     #print regex 
     found.append(regex) 
    print found 
    print len(found) - 1 

これは、私はそれを実行したときに、私が得るものです:

[['10.10.20.192/27'], ['10.10.40.0/24'], []] 
2 

今、私は苦労していますハードの部分は、私は、変数userIP動的でこれらのそれぞれを比較することができる方法です。

#if userIP.overlaps(found): 
#print "Overlapping IPs!!" 
#else: 
#print "Does not Overlap!!" 

おかげ デイモン

+0

Python 3.3を使用している場合は、組み込みの['ipaddress'](https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv4Network.compare_networks)ライブラリを使用できるようです+。しかし、Py2.7ではバックポートパッケージがあります。https://pypi.python.org/pypi/py2-ipaddress –

+0

ipaddr.pyを使用していて、うまく動作しています。動的変数の部分に助けが必要 – Damon

+0

"動的変数"とはどういう意味ですか? – martineau

答えて

2

あなたはこのようなもので、ユーザの入力サブネット1で各IPアドレスを比較することができます(それは実際にあなたのコードよりも少ないメモリを使用しています):

import re 

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:') 
userIP = pseudoSubnetClass(userIP)  # pseudo code 
ipFile = ("router.com.txt") 
found = [] 
with open(ipFile, 'r') as f: 
    for text in f: #File had a blank line so this skips it 
     text = text.rstrip() 
     match = re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', text) 
     if not match: 
      continue 
     found = match[0] 
     if userIP.overlaps(found):  # This part is 
      print "Overlapping IPs!!" # pseudo code too 
      break 
    else: 
     print "Does not Overlap!!" 
+0

userIP.overlaps(found):if subnet.overlaps(found)の代わりにコードを編集しました:AttributeError: 'str'オブジェクトに 'overlaps'属性がありません – Damon

+0

@Damonあなたが言ったあなたは 'ipaddr.py'を使っています。条件付きテストは実際にはあなたの疑似コードです。 'ipaddress'を使うように変更したいのですか? –

+0

条件付きテストは実際には動作します(ipaddr.py)。たとえば:userIPの場合overlaps(found):私はuserIPをハードコードし、変数を見つけ出し、それが想定どおりに機能しました。 – Damon

0

でしたこれはあなたが欲しいものですか?

appendからextendに変更すると、結果のリストは['10.10.20.192/27', '10.10.40.0/24', '']のようになります。

found.extend(regex) 

userIPが見られるもののいずれかと一致するかどうかを尋ねる:

if userIP in found: 
    <suite> 
1

私はあなたがre.findallは、ファイルのすべての行の上にすべてのIPアドレスを引き出すだろうことを考慮したら、あなたは多くの複雑さを避けることができると思いますそれ自体、あなた自身のループを持つ必要はありません。たとえば:

import re 

userIP = raw_input('Enter IP address to compare i.e, 10.10.10.0/24:') 
ipFile = "router.com.txt" 

with open(ipFile) as f: 
    for ip in re.findall(r'(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\/(?:[\d]{1,3})', f.read()): 
     if overlaps(ip, userIP): 
      print "Overlapping IPs!!" 
      break 

overlaps()機能は、論理の残りの部分を説明するのを助けるために、ちょうど作っ例です。

+0

@Philip Tzouとあなたの解決策は明らかな問題を修正した後に働いた。どの方が良いソリューションを使用しているか教えていただけますか?このリストは通常​​10以上のIPを成長させることはありませんが、私は将来のプロジェクトでこれを使うかもしれません。どれが効率的ですか?助けてくれてありがとう。 – Damon

関連する問題