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コミュニティ名等は任意のものをご記載下さい。
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