Panduan SNMP dengan Python PySNMP
Panduan SNMP dengan Python PySNMP
Pada bagian pertama ini kami memperkenalkan protokol SNMP dan penggunaan perintah sistem
yang akan memungkinkan mereka untuk menyentuh konsep-konsep yang kami paparkan.
rencana
Presentasi protokol
oSNMP
oMIB
oASN1
pysnmp
oElemen dasar
oPermintaan
oMeja
Secara konkret memungkinkan untuk memantau keadaan jaringan perangkat atau taman komputer,
seperti bahan dan layanan:
Router, saklar
Stasiun kerja
printer
Layanan (pengiriman pesan, ftp, ssh, http, proses, memori ...)
Untuk pengawasan, perlu memahami "untuk mendapatkan informasi" tentang keadaan ini
elemen". Tetapi protokol ini juga memungkinkan untuk melakukan tindakan pemeliharaan
cara merestart layanan atau mesin, membersihkan kepala baca dari sebuah
printer, dll.
Bagaimana cara kerja SNMP
SNMP didasarkan pada ide bahwa sistem pemantauan jaringan terdiri dari:
Situs wikipedia menawarkan sebuahpresentasi singkatdari yang terakhir ini dalam versi Prancis.
Versi bahasa Inggris dari artikel yang sama adalahjauh lebih lengkapdan menyebutkan rangkaian RFC
yang menggambarkannya.
Ini adalah protokol yang sangat lama dan kompatibel dengan hampir semua penyedia
perangkat keras jaringan.
Sejak versi 2 dan 3, aman, menawarkan akses terbatas ke informasi tertentu dan
berbasis pada protokol enkripsi seperti SSH dan TLS (tetapi dengan protokolnya sendiri
perpustakaan dan alat internal).
Informasi yang terkandung dalam MIB distandarisasi, artinya apa pun yang
perangkat dan pembuatnya, akan dapat mengakses informasi yang sama di yang sama
tempat dan dengan cara yang sama. Dan itu luar biasa:
Anda adalah seorang administrator jaringan, ingin mengetahui total dan memori yang tersedia
sebuah mesin, ia akan memperoleh dengan cara yang sama apapun sistem operasi (mac /
windows / unix / android) dan perangkat keras yang digunakan (AMD, ARM, Intel, ...). "Apakah tidak ada
fabuloso?
Sederhana (agen-agen itu ringan, kompleksitas dipindahkan ke tingkat yang
manajer)
Ini independen dari arsitektur jaringan dan elemen-elemen (PC, printer,
pengarah, ...)
Ini dapat diperluas, Anda dapat menyesuaikan basis data selain apa yang ditawarkan oleh
standar
Dia kokoh. Ini berbasis pada UDP atau TCP:
Akan tetap berfungsi ketika jaringan menghadapi masalah bottleneck yang serius: sebuah
marco informasi UDP adalah ringan.
Namun, kadang-kadang, itu tidak begitu sederhana: MIB adalah "dapat dibaca oleh manusia",
tetapi untuk mengutip salah satu kolega saya, kadang-kadang, mereka yang tiba di sana tidak benar-benar
manusia.
Protokolnya sederhana tetapi implementasinya bisa jauh lebih rumit.
Versi 3 telah mengimplementasikan lapisan SSH-nya sendiri alih-alih menggunakan HTTPS (HTTP
tentang SSH). Ini menyulitkan komunikasi: tidak ada negosiasi otomatis untuk enkripsi
dan harus memberikan 5 informasi untuk membuat koneksi yang aman.
Beberapa pesaing mulaimunculbagaimanaWMIdan menawarkan sebuah bahasa
de consulta más rico (WQL).
sejarah
oLebih modular
Dalam fakta
Versi 2 mengalami masalah saat mulai dan beberapa 'peluncuran' dilakukan. Ini
versi "2c" yang telah menang. Saya menyarankan Anda tentang topik ini dengan membaca ini
presentasi SNMPyang sedikit lebih menjelaskan kesulitan ini dalam pelaksanaan
marcha dan lapresentasi PySNMPyang mengambil beberapa dari poin ini.
Versi 3, sama seperti v2, juga mengalami masalah untuk menguasai.
kompatibel dengan semua bahan saat ini meskipun telah mengalami perbaikan. Masalah dari
keamanan telah menjadi sangat sensitif saat ini dan itu adalah versi yang direkomendasikan.
SNMP mendominasi dunia TCP/IP dan merupakan standar yang direkomendasikan sejak Mei
1990
MIB
Sebelum kita dapat meluncurkan kueri SNMP pertama kita, penting untuk memahami
apa itu MIB.
Ini bukan basis data secara ketat seperti basis data relasional.
Ada hanya melalui agen yang bebas untuk melaksanakannya sesuai keinginannya. Ketika agen itu
agen tidak berfungsi, tidak ada data di MIB. Hanya terdapat deskripsi MIB
(umumnya sebuah file teks).
Ia adalah agen (perangkat lunak) yang menyimpan (tetapi seharusnya dikatakan bahwa mengelola) ini
informasi, yang sering kali 'volatile', seperti yang diinginkan.
Sangat penting untuk memahami poin sebelumnya, yang sering kali menyulitkan
pemahaman MIB oleh para pendatang baru dalam protokol ini.
Sebagian besar informasi dari MIB memiliki sifat ini, yang lain kadang-kadang disimpan.
di suatu tempat, seperti orang yang bertanggung jawab atas mesin, pelabuhan sebuah layanan atau
status dari jalur pasokan atau dioda (mati, menyala) Sesuai dengan
konstruktor / OS, informasi ini disimpan secara fisik dengan cara yang berbeda, tetapi
MIB distandarisasi untuk sebagian besar, sehingga manajer selalu meminta yang sama
informasi dengan cara yang sama. Tergantung pada agen untuk mencari tahu ke mana pergi tergantung pada
material / layanan yang dikelola.
Dan itu memberikan banyak kemudahan dalam penulisan alat uji / pemantauan.
ini adalah salah satu kekuatan besar dari standar ini.
MIB-II
Salah satu MIB yang paling dikenal adalah MIB-II, yang dijelaskan olehRFC 1213.
sistem
antarmuka
Penerjemahan alamat
IP
ICMP
TCP
UDP
EGP
transmisi
y SNMP
Artinya, informasi apa pun yang dapat saya minta tentang MIB-II akan ditempatkan di salah satu dari
grup-grup ini.
Beberapa contoh informasi yang dapat Anda temukan di kumpulan ini adalah:
su nombre, "ifDescr"
tipe, "DisplayString", sebuah string dengan panjang hingga 255 karakter
Untuk memahami deskripsi "hierarkis" dari data "ifDescr", berikut adalah grafik
apa yang diwakili oleh hierarki utama dari semua MIB:
Hierarki utama dari MIB (Layanan Wikipedia)
Ruta menuju informasi organisasi di bawah "ISO", yang terletak di bawah akar,
akan menjadi ".1.3" atau ".[Link]"
Dan seterusnya.
Oleh karena itu, informasi diberi nomor sesuai dengan urutannya di pohon MIB, ini
angka disebut OID (Pengidentifikasi Objek).
Berikut adalah beberapa contoh OID:
Sekarang pertanyaannya menjadi "bagaimana cara menemukan semua informasi yang tersedia di seorang"
MIB?
Jawabannya adalah:
Menyelidiki MIB ini melalui situs web yang memiliki kebaikan untuk
mewakili mereka dengan mudah, seperti situs web diMONITOR IP.
Akan diamati dalam yang terakhir bahwa OID "[Link].[Link].1.2berikan rute lengkap
a la informaciónifDescr ".
Ini adalah apa yang akan kami lakukan dengan PySNMP: mengirimkan kueri menanyakan nilai dari sebuah node
(informasi) terletak di lokasi tertentu dalam MIB atau mengubah nilai ini.
Dan itu saja. Atau hampir. Apa kamu melihat sedikit lebih jelas?
Komunitas
El acceso a la información de un MIB se filtra por lo que se llama la "comunidad", excepto
versi 3 dari protokol.
"Komunitas" adalah jenis kata yang dibagikan, "publik" secara default.
"Publik" dapat berada dekat dengan opsi login "anonim" yang tersedia di sebagian besar dari
server ftp.
Oleh karena itu, ketika Anda ingin mengakses atau mengedit informasi seorang agen, Anda:
Perintah
Sebelum meluncurkan pesanan pertama kami, mari kita lihat jenis permintaan yang ada dalam protokol.
mengusulkan agar para administrator dan agen dapat saling bertukar informasi:
Persyaratan awal
Untuk meluncurkan pesanan pertama kami, diperlukan memiliki seorang agen dan seorang manajer.
Saya merekomendasikan initutorial yang sangat baikuntuk instalasi tersebut di mesin Linux (tipe
debian).
Untuk administrator, Anda dapat menginstal alat dasar snmp dan mib melalui ini.
perintah
Akhirnya, jika Anda tidak memiliki kemungkinan untuk menginstal perintah SNMP di Linux Anda, ketahuilah bahwa
Perpustakaan PySNMP menawarkan skrip setara murni Python yang dapat Anda instal dengan
perintah "pip install pysnmp-apps".
Perintah "DAPATKAN"
Contoh:
Versi protokol yang digunakan adalah wajib, pada perintah sebelumnya kita menggunakan protokol
dari versi 2c dan komunitas "publik".
Kami meminta informasi "sysDescr". Untuk melakukan ini, kami menambahkan jalur ".0" yang menunjuk
nilai dari node sysDescr
Nilai-nilai lainnya di bawah sebuah node (.1, .2, dll.) menandakan subelemen dari yang terakhir.
Oleh karena itu, informasi dapat diminta melalui jalur lengkap dalam bentuk sebuah
OID digital "[Link].[Link]. 0 " (teks) atau melalui nama pendek. Karena itu adalah
biasanya unik.
Jadi Anda bisa memulai ulang perintah di atas dengan OID digital ...
Anda dapat menjalankan GET NEXT di node mana pun, termasuk akar dari MIB.
Untuk menghindari mengirim beberapa perintah "GET" satu setelah yang lain, yang membebani
pertukaran jaringan, dimungkinkan untuk meminta konsultasi beberapa OID sekaligus melalui perintah
"DAPATKAN GROSS". Tapi tidak semua agen menerimanya.
Anda juga bisa menggunakan perintah "Walk" untuk menavigasi seluruh pohon, seperti yang
Saya akan melakukan dengan 'GET' dan 'GET NEXT'. Tetapi adalah perintah 'WALK' yang akan mengeksekusinya untuk Anda.
Terjemahkan OID
Perintah "snmptranslate" digunakan untuk menerjemahkan OID dari mode numerik ke mode
teks dan sebaliknya.
"-u": usuario
"-l": nivel de seguridad para identificarte
"-a": protocolo de autenticación
enkripsi kata sandi
"-A": contraseña de autenticación
"-x": algoritmo de cifrado para la conexión
"-X": contraseña / sal para encriptar la conexión
Di sinilah kita menemukan rasa sakit dari protokol v3 yang mengimplementasikan koneksi SSH
tanpa melakukan SNMP di atas SSH: tidak ada negosiasi otomatis algoritma enkripsi, diperlukan
spesifikasikan semuanya! Hanya untuk diri sendiri! Misera!
Versi 1 dan 2 dari protokol tidak cukup aman dan tidak ada untuk yang pertama.
Perlindungan dalam versi 2 dari protokol dilakukan hanya melalui "komunitas" yang
mereka tidak menggunakan kata sandi. Ini sangat lemah sebagai jenis perlindungan karena hanya membutuhkan
mengetahui nama komunitas untuk mengakses informasi tentang materi yang mungkin
sangat rahasia.
Dalam praktiknya, agen yang disediakan oleh alat NetSNMP (di Linux) adalah
relatif lambat dan tidak selalu terlindungi dengan baik, banyak cacat yang
ditemukan secara teratur.
Oleh karena itu, apa pun solusi yang dipilih, selalu matikan mode anonim atau periksa
setiap informasi yang diberikan.
Kemudian, buat akses ACLS ke setiap MIB berdasarkan pengguna untuk memiliki kontrol penuh atas siapa
apa yang bisa kamu lakukan.
Akhirnya, kami tidak bisa merekomendasikan terlalu banyak untuk memprivilegikan hanya versi 3 dari
protokol.
kesimpulan
Perintah dasar SNMP cukup sederhana setelah Anda memahami bagaimana
memanipulasi parameter yang mereka gunakan.
Bagian pertama dari pengenalan SNMP ini seharusnya telah memberi Anda:
Bagian kedua dari tutorial ini tentang SNMP dan PySNMPdidedikasikan untuk penemuan
de PySNMP:
Instal PySNMP
Akhirnya, bagian keempat akan mengajarkan Anda cara membuat agen menggunakan MIB kustom.
pengantar
Tutorial ini mengusulkan Anda untuk menemukan pustaka Python PySNMP yang memungkinkan dialog.
dengan bahan apa pun yang kompatibel dengan protokol dengan nama yang sama.
Dalam bagian kedua ini, kami akan mempresentasikan penggunaan protokol SNMP melalui pustaka
PySNMP.
Anda bisa mulai belajar langsung dari bagian kedua ini jika Anda sudah memahami protokol.
SNMP.
Namun, jika Anda baru dalam protokol ini, kami sarankan Anda membacanya terlebih [Link]
bagian pertama dari tutorial ini yang akan memperkenalkan protokol SNMP, kualitasnya dan
cacat dan akan memberikan alat dasar untuk mulai menggunakannya dan Anda
kepemilikan. Tanpa pengetahuan awal ini, bab kedua ini mungkin tampak sangat
sulit untuk dipahami.
rencana
Presentasi protokol
oSNMP
oMIB
oASN1
oPermohonan
pysnmp
oPermohonan
oMeja
pysnmp
Sekarang kita telah memperkenalkan protokol SNMP dan beberapa perintah untuk menggunakannya,
akhirnya kita bisa beralih ke topik nyata dari tutorial ini: pustaka PySNMP!
PySNMPini adalah pustaka Python yang mengimplementasikan semua versi protokol
SNMP secara lengkap di Python.
Completo: mengimplementasikan seluruh protokol SNMP (v1 hingga v3) sepenuhnya dalam Python
Cukup ringan, sekitar 15000 baris kode
Cukup sederhana untuk hal-hal sederhana
Secara luas digunakan di komunitas: 30.000 unduhan per bulan di Pypi
Sangat berguna untuk menulis nagios / centeron / probe lainnya atau mengambil informasi dari
SNMP dalam program Python-nya
Memungkinkan Anda untuk menulis agen Anda sendiri
Terkadang itu kompleks dan kurangnya dokumentasi yang jelas tentang elemen tertentu seperti itu.
seperti
Menginstal PySNMP
Namun, di mesin dengan Windows, perintah "pip" biasanya akan gagal dalam
instalasi 'pycrypto' yang ingin dikompilasi oleh 'pip'. Tetapi yang terakhir sering terlihat
terasing dari alat-alat semacam itu.
Dalam hal ini,instal sebelumnya binari 'pycrypto' dari situs iniodari situs ini
untuk Python 3.5.
Jika Anda benar-benar memiliki kesulitan, ikuti initutorial instalasi PySNMP di Windows
ditulis khusus atas permintaan para pembaca kami.
Perpustakaan PySNMP didasarkan pada perpustakaan lain: pyasn1 untuk mencapai ini.
Konversi tipe ASN.1 ke python hampir alami:
de [Link] import *
a = Entero ( 21 ) * 2
mencetak ( a )
a = Entero ( - 1 ) + Entero ( 1 )
mencetak ( a )
a = int ( Masukkan ( 42 ))
cetak ( a )
a = OctetString ( 'Halo' ) + ',' + OctetString ( hexValue =
5079534e4d5021
cetak ( a , jenis ( a ))
Perintah dasar
PySNMP menawarkan beberapa fungsi "tingkat rendah" untuk menggunakan protokol SNMP, tetapi ia
disarankan untuk menggunakan modul "hlapi" yang berarti "API tingkat tinggi".
Yang terakhir menawarkan fungsi tingkat tinggi, mudah disiapkan untuk menjalankan perintah.
dasar-dasar yang dapat dicantumkan dengan cara ini
yang menunjukkan
[ 'bulkCmd' , 'getCmd' , 'nextCmd' , 'setCmd' ]
Bantuan tentang fungsi getCmd di pysnmp. hlapi:
pysnmp . hlapi . getCmd = getCmd ( snmpEngine , authData ,
transportTarget , contextData , * varBinds , ** opciones )
Buatlah generator untuk melakukan satu atau lebih kueri SNMP GET.
Sebelum menggunakan perintah ini, kita akan belajar bagaimana memanipulasi parameter yang
membutuhkan:
OIDS
". "
Bermula dari alun-alun pusat, beberapa jalan menantangmu.
1
Ambil yang pertama dari kiri
Kamu sampai di tempat baru.
2
Berbagai jalan menghadapi kamu lagi.
Ambil yang kedua di sebelah kiri kamu.
Kamu tiba di tempat baru.
3
Berbagai jalan menghadapkanmu lagi.
Ambil yang ketiga di sebelah kiri Anda.
Kamu sampai di tempat baru.
0
Ada sebuah plakat di bingkai, berisi informasi kamu.
Jika mengirim 'GET' dia membacanya, jika mengirim 'SET' dia mengubahnya.
Jalan di MIB
Sebuah OID diwakili oleh sekumpulan nilai numerik atau oleh serangkaian
nama-nama yang menunjuk setiap cabang yang dilalui di MIB.
Jika Anda ingin mendapatkan informasi lebih lanjut tentang OID ini, saya mengundang Anda untuk membacadokumentasi dari
PySNMP tentang tema ini.
Untuk membuat OID dengan PySNMP, perlu membuat instance dari kelas
"ObjectIdentity"
o = ObjectIdentity ( '[Link].[Link].0' )
o = ObjectIdentity (( 1 , 3 , 6 , 1 , 2 , 1 , 1 , 3 , 0 ))
o = ObjectIdentity ( 'SNMPv2-MIB' , 'sysUpTime' , 0 )
o = ObjectIdentity ( '[Link]-
[Link].0'
Sangat penting untuk benar-benar mencari OID ini di MIB, karena banyak.
MIB. PySNMP dilengkapi dengan seluruh arsenal MIB, tetapi Anda harus memberitahunya di mana
menemukan mereka.
Dan untuk dokumentasi itu sangat disayangkan karena tidak pernah menunjukkan contoh
nyata!
Anda memiliki hak untuk mengganggu; Setelah saraf Anda tenang, ingatlah
apa itu produk OpenSource dan apa keuntungan yang didapatkan dengan akses ke kodenya.
Perintah 'ayuda' Python menunjukkan bahwa ada metode 'resolveWithMib'.
Ini dapat memiliki beberapa mesin untuk, misalnya, bekerja dengan beberapa MIB.
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
o resolveWithMib ( mvc )
o = ObjectIdentity ( '[Link].[Link].0' )
cetak ( o . getLabel ())
cetak ( o . getMibNode ())
cetak (o . getMibSymbol ())
cetak ( o . getOid ())
imprimir ( o . prettyPrint ())
Pengendali tampilan mib tidak didefinisikan karena kita belum membuat "UserContext".
Solusi yang paling sederhana adalah, pada akhirnya, menciptakan sendiri kami
"MibViewController":
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
si tidak mvc :
mvc = MibViewController ( ver getMibBuilder ())
o = ObjectIdentity ( '[Link].[Link].0' )
o resolveWithMib ( mvc )
cetak ( o . getLabel ())
cetak ( o . getMibNode ())
cetak ( o . getMibSymbol ())
cetak ( o . getOid ())
cetak ( o . prettyPrint ())
Ya, tetapi saya bekerja dengan MIB yang dipatenkan karena saya adalah seorang pembangun perangkat keras atau menggunakan
hardware spesifik pabrikan dan saya memerlukan MIB saya sendiri.
Tidak ada masalah, OID dapat melakukannya untuk Anda.
Mari kita anggap Anda memiliki MIB Anda sendiri, seperti di bawah ini, yang telahpengambilan dari tutorial ini
:
IMPORTACIONES
OBJEK TIPE, Integer32, NOTIFIKASI-TIPE, perusahaan
DARI SNMPv2-SMI
;
dataValue OBJECT-TYPE
Sintaks Integer32
MAX-ACCESS hanya baca
Kondisi saat ini
DESCRIPCIÓN "Un conteo de muestra de algo".
:: = {MakinaCorpus 1}
testTrap JENIS_NOTIFIKASI
Kondisi saat ini
DESCRIPCIÓN "Notificación de prueba"
:: = {MakinaCorpus 3}
FIN
Secara umum, MIB dari para produsen disimpan di "perusahaan" OID: iso. org.
dod. Internet . pribadi Perusahaan ([Link].4.1)
Situs pemantau IP menunjukkan bahwa subnodo ".3" adalah kosong, jadi saya memilihnya untuk
menginstal Makina MIB sebelumnya, tetapi bisa mengambil subnodo yang sudah ada.
Sekarang perlu mengompilasi MIB ini denganPySMI. Biasanya pustaka ini diinstal
dengan PySNMP, jika tidak jalankan "pip install pysmi".
PySNMP dilengkapi dengan beberapa skrip, termasuk "build-pysnmp-mib" yang akan melakukan ini untuk kita.
conversión:
Ini akan menghasilkan file "MAKINA_MIB.py" yang berisi kode Python yang
implementasikan MIB ini.
Namun, sejak versi 4.3 dari PySNMP, skrip "build-pysnmp-mib" telah menjadi
usang dan sudah tidak dikirim.
Untuk mengompilasi MIB Anda, Anda harus menggunakan skrip "[Link]", yang biasanya diinstal di
folder "/usr/local/bin"
Akhirnya, untuk membangun OID menggunakan yang terakhir ini, sekarang Anda harus menulis:
o = ObjectIdentity (( 1 , 3 , 6 , 1 , 4 , 1 , 3 , 1 ))
o addMibSource ( '/ jalur / ke / makina_mib / dot / py / folder ' )
o loadMibs ( "MAKINA_MIB" )
o resolveWithMib ( mvc )
Kita akan melihat saat menjalankan perintah dasar bahwa kita juga dapat menentukan langsung.
sumber ASN.1 al lieu de mengompilasi MIB. Sejak versi 4.3, PySNMP dapat melakukannya
secara otomatis dalam beberapa kasus.
Mesin SNMP
PySNMP memungkinkan dialog dengan semua komponen SNMP melalui sebuah objek
Motor SNMP. Sudeskripsi lengkaptersedia dalam dokumentasi resmi.
Seringkali Anda hanya perlu menginstansikannya.
Pengaturan otentikasi
ousmAesCfb128Protokol
ousmAesCfb192Protokol
ousmAesCfb256Protocol
Contoh:
u = UsmUserData ( 'userlogin' )
, authKey = 'authenticationkey'
, privKey = 'encryptionkey'
, privProtocol = usmAesCfb256Protocol )
cetak ( u )
UsmUserData (userName = 'userlogin', authKey = <AUTHKEY>,
privKey = <PRIVKEY>, authProtocol = (1, 3, 6, 1, 6, 3, 10, 1, 1, 2),
privProtocol = (1, 3, 6, 1, 4, 1, 9, 12, 6, 1, 2),
securityEngineId = '<DEFAULT>', securityName = 'userlogin')
Jenis-jenis transportasi
Oleh karena itu, itu akan menjadi contoh salah satu dari 2 jenis transportasi ini:
TargetTransportUdp
TujuanTransportUdp6
Ejemplo:
Konteks
Ini adalah konteks SNMP seperti yang didefinisikan diRFC 3411. # 3.3.1
Oleh karena itu, konteks memungkinkan untuk menunjukkan kepada subset MIB mana agen diarahkan.
ContextEngineId
O el contextName
Perintah "DAPATKAN"
Sekarang kita telah memeriksa semua elemen yang diperlukan untuk pemanggilan pesanan,
AKHIRNYA kita dapat menulis perintah GET pertama kita
Untuk mengirim pesan "DAPATKAN", gunakan fungsi "getCmd" yang disebutkan di atas.
Akhirnya, ketika Anda menjalankan perintah ini, Anda dapat meminta beberapa OID sekaligus.
Sintaksisnya adalah sebagai berikut:
data = (
TipeObjek ( IdentitasObjek ( 'SNMPv2-MIB' , 'lokasiSistem' , 0 ))
TipeObjek ( IdentitasObjek ( 'SNMPv2-MIB' , 'sysDescr' , 0 ))
)
g = getCmd ( SnmpEngine ()
, CommunityData ( 'publik' , mpModel = 0 )
, UdpTransportTarget (( '[Link]' , 161 ))
, ContextData ()
, * data )
jika indikasiKesalahan :
print ( errorIndication )
elif statusKesalahan :
print ( ' % s dan % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) -
1 ] [ 0 ] o '?'
)
)
lain :
para varBind di varBinds :
cetak('=' . gabung([[Link]() untuk x di varBind]))
SNMPv2-MIB :: sysLocation.0 = Moscú, Rusia
SNMPv2-MIB :: sysDescr.0 = SunOS [Link] 4.1.3_U1 1 sun4m
Untuk menjalankannya dengan protokol "v3", ganti instance "CommunityData" dengan sebuah
instansi "UsmUserData".
UsmUserData ( "usr-sha-des"
, authProtocol = usmHMACSHAAuthProtocol
, authKey = "authkey1"
, privProtocol = usmDESPrivProtocol
, privKey = "privkey1"
Perintah GetNEXT
Perintah "GetNEXT" dijalankan persis seperti perintah "get", dengan yang sama
parameter
Ambil elemen yang mengikuti OID yang diberikan sebagai argumen.
dari impor [Link] *
g = nextCmd ( SnmpEngine ()
, CommunityData ( 'public' , mpModel = 1 )
, UdpTransportTarget (( '[Link]' , 161 ))
, DataKonteks ()
, TipeObjek ( IdentitasObjek ( 'SNMPv2-MIB' , 'sysObjectID'
, 0 )))
jika indikasiKesalahan :
print ( errorIndication )
elif errorStatus :
print ( ' % s dan % s ' % (
errorStatus . prettyPrint ()
, errorIndex y varBinds [ int ( errorIndex ) - 1
o '?'
)
)
lainnya :
para varBind di varBinds :
cetak ( '=' . bergabung ([ x . prettyPrint () untuk x dalam varBind ]))
SNMPv2-MIB :: sysUpTime.0 = 280102869
Seperti yang mungkin sudah Anda perhatikan, perintah tersebut mengembalikan sebuah "generator".
Jadi Anda dapat mengembalikan panggilan dengan fungsi "berikutnya" untuk mendapatkan yang berikutnya
artículo.
Ini memungkinkan Anda untuk mengunduh MIB lengkap dengan memodifikasi kode sebelumnya, setelah itu
variabel "g" membuat sebuah instance.
g = nextCmd ( SnmpEngine ()
, DataKomunitas ( 'publik' , mpModel = 1 )
UdpTransportTarget (( '[Link]' , 161 ))
, ContextData ()
, TipeObjek ( IdentitasObjek ( 'SNMPv2-MIB' , 'sysObjectID'
, 0 )))
if errorIndication :
["cetak ( indikasiKesalahan )"]
elif errorStatus :
cetak (' % s en % s ' % (
errorStatus . prettyPrint (),
errorIndex y varBinds [ int ( errorIndex ) - 1 ] [ 0 ] o '?'
)
)
lain :
para varBind di varBinds :
cetak ( '=' . gabung ([ x . tampilkanMenyenangkan () untuk x di
varBind ]))
SNMPv2-MIB :: sysUpTime.0 = 280140241
SNMPv2-MIB :: sysContact.0 = Laboratorium SNMP,info@[Link]
SNMPv2-MIB :: sysName.0 = [Link]
SNMPv2-MIB :: sysLocation.0 = Moscú, Rusia
SNMPv2-MIB :: sysServices.0 = 72
SNMPv2-MIB :: sysORLastChange.0 = 280140343
SNMPv2-MIB :: sysORID.1 = PYSNMP-MIB :: pysnmpObjects.1
SNMPv2-MIB :: sysORDescr.1 = comentario nuevo
SNMPv2-MIB :: sysORUpTime.1 = 123
Perintah "SET"
Perintah "SET" dijalankan persis seperti perintah "get", dengan yang sama
parameter
Kecuali bahwa ObjectType mengandung argumen kedua: nilai baru.
def tampilkan_barang ( ):
g = getCmd ( SnmpEngine ()
, CommunityData ( 'publik' , mpModel = 1 )
, UdpTransportTarget (( '[Link]' , 161 ))
, ContextData ()
, TipeObjek ( IdentitasObjek ( 'SNMPv2-MIB' ,
'sysORDescr' , 1 )))
tampilkan_item ()
SNMPv2-MIB :: sysORDescr.1 = Ini adalah catatan baru saya
SNMPv2-MIB :: sysORDescr.1 = Hai dari Lannion menggunakan prosesor
Kalray di Linux
kesimpulan
Perintah dasar SNMP digunakan dengan cukup mudah setelah Anda memahaminya.
bagaimana mengkonfigurasi berbagai parameter yang dibutuhkan.
Bagian kedua dari inisiasi SNMP dan PySNMP ini seharusnya telah memberikan Anda:
Kita masih harus melihat beberapa elemen yang lebih canggih seperti:
introduksi
Tutorial ini mengajak Anda untuk menemukan pustaka Python PySNMP yang memungkinkan dialog
dengan bahan apa pun yang kompatibel dengan protokol dengan nama yang sama.
Pada bagian ketiga ini, kami akan menunjukkan cara untuk mengakses data bertipe 'tabel' dari baris perintah
komando dan dengan pustaka PySNMP.
Jika Anda tidak mengenal protokol SNMP, kami mengundang Anda untuk membacabagian
pertama dari tutorial ini yang Anda
akan mempersembahkan protokol SNMP, sifat dan kekurangan, dan akan memberikan kepadanya
alat dasar untuk mulai menggunakannya dan melepasnya. Tanpa pengetahuan awal ini,
bab ketiga ini mungkin terlihat sangat sulit untuk dipahami.
Jika Anda belum pernah menggunakan pustaka PySNMP, kami juga mengundang Anda untuk membacabagian
kedua dari
tutorial ini akan memberikan Anda konsep dasar untuk menggunakan protokol SNMP dalam Python.
Meja-meja
Sebagian informasi MIB disediakan dalam bentuk tabel.
Antarmuka tabel
Tabel Antarmuka berisi informasi tentang entitas
- antarmuka. Setiap sublapisan di bawah lapisan internetwork
- dari antarmuka jaringan dianggap sebagai antarmuka.
ifTable OBJEK TIPE
SINTAKSIS URUTAN IfEntry
MAX-ACCESS tidak dapat diakses
STATUS saat ini
DESCRIPCIÓN
Daftar entri
diberikan oleh nilai ifNumber ".
:: = {antarmuka 2}
IfEntry :: =
SECUENCIA {
ifIndex IndeksAntarmuka,
ifDescr DisplayString
ifType IANAifType,
ifMtu Integer32,
ifSpeed Gauge32,
ifAlamatFisik AlamatFisik,
ifAdminStatus INTEGER,
ifOperStatus INTEGER,
jikaPerubahanTerakhir WaktuTick,
ifInOctets Counter32,
ifInUcastPkts Counter32,
ifInNUcastPkts Counter32, - usang
ifInDiscards Counter32
ifInErrors Counter32,
ifInUnknownProtos Counter32,
ifOutOctets Counter32,
ifOutUcastPkts Counter32,
ifOutNUcastPkts Counter32, - usang
ifOutDiscards Counter32,
ifOutErrors Counter32,
ifOutQLen Gauge32, - usang
ifSpecific OBJECT IDENTIFIER - tidak lagi berlaku
}
Dibaca bahwa elemen "ifTable" adalah urutan elemen "ifEntry" dan bahwa setiap
elemen "ifEntry" diindeks oleh elemen "ifIndex".
Akhirnya, "ifEntry" itu sendiri adalah urutan dari banyak elemen seperti "ifDescr",
"ifType", "ifSpeed", etc.
Dengan kata lain, "ifTable" adalah sebuah matriks garis dari jenis "ifEntry" dengan banyak
kolom "ifDescr", "ifType", dll.
Adalah mungkin untuk menemukan berbagai catatan dari tabel berkat indeks "ifIndex" dari
entradas "ifEntry". Aquí tenemos 2 valores para el índice: 1 y 2, por lo tanto, 2 registros.
Oleh karena itu, setiap kolom dari catatan "ifEntry" akan terasosiasi dengan indeksnya:
Dengan cara ini, adalah mungkin untuk mengkonstruksi kembali semua rekaman melalui perintah
"snmpwalk" dan nilai indeksnya. Tapi itu melelahkan.
Perintah "snmptable" melakukan ini secara otomatis untuk Anda:
Ini bisa menjadi rumit ketika sebuah entri tabel diindeks oleh beberapa indeks.
Anda mungkin telah mencatat bahwa nilai indeks terletak di OID setiap "kolom". Ini adalah
sama ketika ada beberapa indeks, mereka terhubung dalam OID, saya biarkan Anda membacala
dokumentasi PySNMP di tabel, ituyang menjelaskan dengan cukup baik.
Tapi Anda bisa melakukannya dengan cara yang sangat sederhana menggunakan perintah "nextCmd" jika Anda mengkonfigurasinya
dengan benar.
Sebelum melihat cara melakukan bacaan ini dengan praktik baik, kita akan mencoba menjelajahi
berbagai elemen MIB "Antarmuka" OID (IF-MIB, ifTable) secara manual dan
kami akan mengembalikan daftar kamus, masing-masing dengan nilai dari masing-masing kolom
nodo "ifEntry".
Ini akan memungkinkan kita untuk lebih memahami mekanisme yang digunakan oleh PySNMP dan akan mengajarkan kita untuk
memanipulasi iterasi yang berurutan dari "nextCmd."
Menggunakan perintah berikut, kita akan melihat semua elemen dari entri (IF-MIB, ifTable):
g = nextCmd ( SnmpEngine ()
, CommunityData ( 'publik' , mpModel = 1 )
, UdpTransportTarget (( '[Link]' , 161 )
, ContextData ()
ObjectType ( ObjectIdentity ( 'IF-MIB' , 'ifTable' ))
, lexicographicMode = False )
cetak ( varBind )
oid = varBind [ 0 ]
value = varBind [ 1 ]
Jadi kita bisa membuat daftar setiap elemen "ifEntry" dalam sebuah kamus, dari
cara berikutnya:
se = SnmpEngine ()
mvc = se . getUserContext ( 'mibViewController' )
si tidak mvc :
mvc = MibViewController ( ver getMibBuilder () )
#
# # [Link].[Link] ('iso', 'org', 'dod', 'internet', 'mgmt', 'mib-2',
'interfaces', 'ifTable')
oid_iftable = ObjectIdentity ( 'IF-MIB' , 'ifTable' )
oid_iftable . resolveWithMib ( mvc )
cetak ( varBind )
oid = varBind [ 0 ]
value = varBind [ 1 ]
Cetak elemen
untuk ind, elemen di enumerate (data):
Cetakan ( "Artikel % s " % ( str ( ind + 1 ), ))
untuk kunci, nilai dalam artikel. artikel ():
print ( " % s : % s " % ( kunci , nilai ))
Pencetakan artikel
Artículo 1
ifOutUcastPkts: 11277302
ifInErrors: 0
ifInUcastPkts: 22554581
ifOutErrors: 0
ifOutDiscards: 0
ifInNUcastPkts: 2506064
ifType: 'ethernetCsmacd'
jikaSpesifik: SNMPv2-SMI :: nolTitikNol
ifSpeed: 100000000
ifPhysAddress: 00: 12: 79: 62: f9: 40
ifOutNUcastPkts: 1253033
ifOperStatus: 'up'
ifIndex: 1
ifInOctets: 275667056
ifDescr: eth0
ifLastChange: 150603818
ifInDiscards: 0
ifOutOctets: 125303333
ifAdminStatus: 'arriba'
ifInUnknownProtos: 125301
ifMtu: 1500
ifOutQLen: 0
Artikel 2
ifOutUcastPkts: 11277305
ifInErrors: 0
ifInUcastPkts: 22554583
ifOutErrors: 0
ifOutDiscards: 0
ifInNUcastPkts: 2506065
ifType: 'ethernetCsmacd'
ifSpecific: SNMPv2-SMI :: zeroDotZero
ifSpeed: 100000000
ifPhysAddress: 00: 12: 79: 62: f9: 41
ifOutNUcastPkts: 1253034
ifOperStatus: 'up'
ifIndex: 2
ifInOctets: 250606431
ifDescr: eth1
ifLastChange: 249303192
ifInDiscards: 0
ifOutOctets: 125303346
ifAdminStatus: 'arriba'
ifInUnknownProtos: 125304
ifMtu: 1500
ifOutQLen: 0
Teknik ini berguna untuk memahami bagaimana catatan diorganisir dalam tabel SNMP dan
untuk membangun kembali secara manual.
Tapi perintah "getNext" membuatnya lebih mudah untuk memulihkannya dengan jauh lebih sederhana saat
menunjukkan informasi apa yang ingin kita baca di entri "ifEntry" untuk masing-masing dari mereka
panggilan daripada membacanya satu per satu, seperti sebelumnya.
Untuk itu, cukup berikan OID yang kita minati hanya sekali:
item = 0
para errorIndication , \
errorStatus , \
errorIndex , \
varBinds dan nextCmd (SnmpEngine (),
CommunityData ( 'publik' , mpModel = 0 )
UdpTransportTarget (( '[Link]' ,
161 ))
ContextData ()
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifDescr' ))
TipeObjek ( IdentitasObjek ( 'IF-MIB' ,
'ifType' )),
ObjectType ( ObjectIdentity ( 'IF-MIB', 'ifMtu'
)),
JenisObjek ( IdentitasObjek ( 'IF-MIB' ,
'ifSpeed' ))
TipeObjek ( IdentitasObjek ( 'IF-MIB' ,
'ifType' ))
ObjectType ( ObjectIdentity ( 'IF-MIB' ,
'ifPhysAddress' ))
lexicographicMode = False ):
Artikel 0
IF-MIB :: ifDescr.1 = eth0
IF-MIB :: ifType.1 = 'ethernetCsmacd'
IF-MIB :: ifMtu.1 = 1500
IF-MIB :: ifSpeed.1 = 100000000
IF-MIB :: ifType.1 = 'ethernetCsmacd'
IF-MIB :: ifPhysAddress.1 = 00: 12: 79: 62: f9: 40
Artikel 1
IF-MIB :: ifDescr.2 = eth1
IF-MIB :: ifType.2 = 'ethernetCsmacd'
IF-MIB :: ifMtu.2 = 1500
IF-MIB :: ifSpeed.2 = 100000000
IF-MIB :: ifType.2 = 'ethernetCsmacd'
IF-MIB :: ifPhysAddress.2 = 00: 12: 79: 62: f9: 41
kesimpulan
Kami melihat di bagian ketiga ini bagaimana mengelola tabel SNMP dengan baris perintah atau
perpustakaan Python.
PySNMP tidak memiliki perintah khusus untuk menjelajahi tabel, jadi kita harus
daftar semua elemennya melalui "getNext".
Untungnya, adalah mungkin untuk memulihkan semua properti dari sebuah entri melalui sebuah
panggilan tunggal ke "getNext", yang sangat menyederhanakan rekonstruksi catatan
dari tabel.
Dalam bagian keempat tutorial ini, kita akan belajar bagaimana cara membuat agen.