0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PySNMPで取得したIPv6アドレスを省略表記で出力する

Last updated at Posted at 2019-06-18

Python の SNMPライブラリである PySNMP で取得した IPv6アドレスは、そのままの形ですと非常に使いづらいです。
IPv6省略表記に成型出力するようにした備忘録となります。

・環境
Server OS: CentOS 7.5
Python Ver: 3.6.8

##取得情報の変形について
今回はPysnmpでOID1.3.6.1.2.1.4.34.1.3.2(ipAddressIfIndex)の情報を取得する場合を考えます。

Pysnmpで取得したIPv6アドレスに該当する個所は以下のようになります。
22.3.5.56.4.0.0.17.0.0.0.0.0.0.0.6
8bitずつピリオドで区切られてかつ10進数表記です。

これを

1603:0538:0400:0011:0000:0000:0000:0006
のように16bitずつコロンで区切られた16進数表記に変えたうえで

1603:538:400:11::6
最終的に省略表記にして出力します。

##Python3 コード
SNMPコミュニティ名等は任意のものをご記載下さい。

ipv6_sample.py

from pysnmp.hlapi import *
import ipaddress
import sys

argvs = sys.argv

def ipv6_search(host) :

    oid = "1.3.6.1.2.1.4.34.1.3.2"

    # snmp情報を取得する
    for (errorIndication,
         errorStatus,
         errorIndex,
         varBinds) in nextCmd(SnmpEngine(),
                              CommunityData('コミュニティ名'),
                              UdpTransportTarget((host, ポート番号)),
                              ContextData(),
                              ObjectType(ObjectIdentity(oid)),
                              lexicographicMode=False
                              ):

          # 取得できたインタフェース分繰り返す
          for name, val in varBinds:
              spr1 = str(name).split('.')
              spr2 = str(val).split(' ')
              iplist = ''
              for i in range (12,28):
                  # iplistに各オクテットを16進数に変換し0埋めして足していく
                  iplist += str('{:02x}'.format(int(spr1[i])))
                  if i % 2 == 0 or i > 26:
                      continue
                  else:
                      # 所定の位置にコロンを加える
                      iplist += ":"
              # ipaddressモジュールでIPv6短縮形にして表示
              print ("Ifindex:%s,ipv6address:%s" % (spr2[0],ipaddress.IPv6Address(iplist)))


if __name__ == '__main__':

    ipv6_search(argvs[1])

##実行結果
以下のように、対象ネットワーク機器のインターフェースが持つIPv6アドレスを短縮表記で取得できます★
今回は合わせてIPv6アドレスを持つインターフェースのindexを取得するようにしていますが、用途に応じて好きな情報を取得します。

$ python if_ipv6_sample.py 情報取得したいネットワーク機器のIP
Ifindex:20,ipv6address:1603:538:400:11::6
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?