Tcl untuk Cisco IOS dalam Contoh Sederhana

Bayangkan Anda perlu menggunakan lusinan sakelar akses Cisco dari jenis yang sama dari awal. Konfigurasi khas meliputi nama host dan domain, gateway default, kata sandi, daftar pengguna, alamat IP untuk SVI, nomor VLAN, pengaturan untuk batang uplink, dll. Memasukkannya setiap kali dengan tangan Anda sangat panjang dan tidak produktif. Tentu saja, Anda dapat membuat konfigurasi biasa dan mengunggahnya melalui (T) FTP, tetapi, pertama, itu akan memerlukan setidaknya konfigurasi minimal dari konsol, dan kedua, parameter konfigurasi yang bisa berubah masih harus diubah. Untuk menyelesaikan tugas-tugas ini (dan juga banyak lainnya), Cisco IOS berisi alat otomatisasi yang kuat - interpreter Tcl bawaan (skrip Cisco IOS w / Tcl).

Apa itu Tcl


Tcl (dapat dibaca "tickle", kadang-kadang "flowed") adalah bahasa pemrograman yang ditafsirkan yang dikembangkan pada akhir tahun 80-an untuk menanamkan dalam aplikasi konsol. Berbagai kemampuan Tcl modern cukup luas: di sini ada dukungan untuk OOP, dan alat regexp canggih, array dinamis, dll.

Dukungan untuk bahasa ini pertama kali muncul pada platform T Cisco IOS 12.2 (3) (dalam beberapa sumber ditunjukkan pada 12.3 (2), tetapi saya tidak menemukan konfirmasi tentang ini) dan saat ini memiliki beberapa opsi:

  • Tcl interpreter dengan antarmuka baris perintah. Ini terintegrasi ke dalam berbagai versi platform Cisco IOS, termasuk IOS XE dan XR, dan tersedia untuk berbagai perangkat. Memungkinkan Anda untuk menjalankan perintah Tcl, menjalankan skrip yang sudah jadi sebagai file, dll. Perangkat yang menggunakan bukan iOS sebagai sistem operasi tetapi, misalnya, Cat OS atau ASA (di firewall dengan nama yang sama) tidak mengandung baris perintah juru bahasa.
  • T.N. “Built-in event manager” atau EEM - sistem pelacakan peristiwa yang memungkinkan Anda untuk merespons secara otomatis dalam waktu nyata. Misalnya, monitor host jarak jauh dengan notifikasi email. Script EEM (applet) ditulis dalam Tcl, tetapi EEM itu sendiri tidak menyediakan baris perintah Tcl yang terpisah. Contoh penggunaan lihat di sini . EEM tersedia pada platform Nexus (NX OS) dan ASA dari versi 9.2 (1) dan lebih tinggi.
  • Sistem Menu Suara IVR (Respon Suara Interaktif).

Bagaimana cara menentukan keberadaan juru bahasa perintah mengetahui model perangkat atau versi iOS? Ada Cisco Feature Navigator untuk ini :

gambar

Item menu Fitur Penelitian memungkinkan Anda untuk memilih versi IOS tertentu untuk Rilis Kereta IOS yang diberikan atau platform perangkat keras tertentu. Item menu Perangkat Lunak Penelitian memungkinkan Anda menemukan semua versi iOS dengan dukungan Tcl untuk perangkat keras yang diberikan. Kami mengklik, memfilter bidang Saring berdasarkan nama (Nama fitur) “Script Cisco IOS w / Tcl” (atau cukup “Tcl”), menambahkan nama fitur ke daftar, pilih Rilis kereta dan dapatkan daftar semua versi iOS yang berisi fitur ini:



Sayangnya, basis data CFN tidak lengkap dan terkadang tidak menampilkan semua informasi. Jadi, untuk platform CAT2960S, navigator menunjukkan keberadaan Tcl dalam rilis iOS 15.2E1 dan tidak menunjukkan dalam rilis 15.2E9, meskipun sebenarnya interpreter Tcl ada di sana-sini.

Apa yang dapat dilakukan di Cisco IOS menggunakan Tcl? Cukup banyak: jelajahi dan modifikasi konfigurasi, buat skrip interaktif, operasikan pada objek MIB, soket TCP dan UDP, dan bahkan ... tulis seluruh web shell!

Secara umum, program Tcl berisi urutan perintah yang dipisahkan oleh baris baru atau titik koma. Contoh Non-Penjelasan:

puts "Hello, world!"; puts "My first Tcl IOS script!" 

Beberapa operator:

# beri komentar di akhir baris
set a 1 penugasan a = 1
$a mendapatkan nilai variabel
{ } pernyataan blokir - mendefinisikan isi loop atau kondisi
[ ] operator substitusi - saat dijalankan, alih-alih tanda kurung, nilai ekspresi yang terkandung di dalamnya akan diganti
== <= <> operator perbandingan
puts "text" menampilkan string "teks" di stdout (yaitu, ke konsol)
puts $a cara puts $a sama untuk nilai a
gets stdin membaca nilai dari konsol
set a [gets stdin] masukkan nilai dari konsol dan tetapkan variabelnya a
for {set i 1} {$i < 10} {inrc i} {....} untuk loop
prosedur proc {argument, ....} {body}

Untuk daftar yang lebih lengkap, lihat progopedia.ru/language/tcl

Penerjemah Tcl dimulai oleh perintah tclsh dari mode EXEC yang diunggulkan:

 sw#Tclsh sw(tcl)# 

Jalankan skrip pertama:

gambar

Keluar dari juru bahasa adalah perintah tclquit atau hanya keluar. Tcl peka huruf besar-kecil, jadi Puts "Hello, world" akan membuat kesalahan, tetapi register shell dari shell IOS tidak penting. Semua perintah input diproses terlebih dahulu oleh juru bahasa Tcl, jika perintah input dapat dieksekusi dengan demikian. Tcl, dijalankan dan hasilnya adalah output ke perangkat TTY. Jika perintah tidak dapat dieksekusi oleh penerjemah, perintah itu diteruskan ke pengurai perintah IOS. Dengan demikian, satu skrip dapat menggabungkan pernyataan Tcl dan perintah IOS. Lingkungan IOS tidak mengandung editor teks lengkap, jadi skrip yang telah ditentukan harus dibuat dengan cara eksternal dan hanya kemudian disalin ke flash atau ke memori. Ini juga mendukung prakompilasi skrip dalam bytecode dengan peluncuran berikutnya. Peluncuran file skrip dieksekusi oleh perintah

 tclsh flash:filename 

Beberapa sesi juru bahasa Tcl dari sesi TTY yang berbeda diperbolehkan.

Perintah internal juru bahasa Tcl:
exec - Menjalankan perintah yang dikutip dari IOS CLI set EXEC priveleged.
sw(tcl)#exec "show int fa0" akan sw(tcl)#exec "show int fa0" :

gambar

ios-config - mengeksekusi perintah dari mode konfigurasi global. Di belakangnya, dalam kutipan pasangan terpisah, semua perintah sub-konfigurasi selanjutnya ditunjukkan. Sebagai contoh:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
setara dengan serangkaian perintah iOS:

 sw#conf te sw(config)#int fa0 sw(conf-int)#ip address 192.168.0.1 255.255.255.0 sw(conf-int)#no shut 

Tcl interpreter mencegah proses exec dari berinteraksi secara langsung dengan konsol. Oleh karena itu, transfer data ke proses exec yang diluncurkan dari Tcl shell terjadi menggunakan perintah typeahead :
typeahead "y\ny"
exec "reload"

Pertama, dua karakter "y" akan disimpan dalam buffer input, dipisahkan oleh baris baru (\ n), kemudian perintah reload exec akan diluncurkan, yang akan membaca perintah pembatalan atau konfirmasi reset dari buffer input dan (jika perlu) menyimpan konfigurasi.

Tickle tidak mendukung pengetikan, ini harus diingat ketika beroperasi dengan variabel:

gambar

Operator bersarang [expr {..}] menghitung nilai ekspresi yang ditentukan dalam kurung keriting ($ a + $ b) dan melakukan substitusi dari nilai ini alih-alih kurung siku.

Contoh prosedur di Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}

saat Anda memasukkan kurung kurawal, interpreter tidak akan menutup baris perintah sampai Anda memasukkan sepasang kurung kurawal. Prosedur disimpan dalam memori juru hingga akhir sesi juru bahasa dengan perintah tclquit. Hal ini memungkinkan untuk memulai prosedur dan mengakses variabel skrip yang diluncurkan sebelumnya. Ingatlah bahwa kesalahan dalam skrip dapat menyebabkan pengulangan dan memblokir sesi TTY (V) Anda! Konsol tidak memiliki fasilitas shutdown darurat (seperti Ctrl + Break), satu-satunya cara adalah memulai sesi baru dan clear line sesi "beku" dengan perintah clear line .

Sekarang mari kita beralih ke pemecahan masalah praktis. Di depan kami ada 48-port Cat2950S di luar kotak. Script di bawah ini

  • meminta dari konsol nomor seri sw_num switch
  • set nama host untuk itu dari form switch_ <sw_num>
  • meminta dan menetapkan kata sandi untuk konsol EXEC priveleged
  • mengkonfigurasi alamat pada antarmuka kontrol Fa0 (192.168.0.x) dan antarmuka Vlan1 (10.0.x.254) sesuai dengan nomor sakelar yang dimasukkan
  • membuat reservasi DHCP berbasis port dan kumpulan 48 alamat, di mana satu alamat IP dicadangkan untuk setiap klien, oktet bawah yang sama dengan nomor seri port di mana klien ini terhubung.

 puts "Enter Switch number:" set sw_num [gets stdin] ios_config "hostname switch_$sw_num" puts "Enter password (secret):" set pass [gets stdin] ios_config "enable secret 0 $pass" ios_config "line 0 16" "password 0 $pass" "login" ios_config "int fa0" "ip address 192.168.0.$sw_num 255.255.255.0" "no shut" ios_config "int vlan1" "ip address 10.0.$sw_num.254 255.0.0.0" "no shut" ios_config "ip dhcp use subscriber-id client-id" ios_config "ip dhcp subscriber-id interface-name" #    48       subscriber-id for {set i 1} {$i <= 48} {incr i} {ios_config "int Gi1/0/$i" "ip dhcp server use subscriber-id client-id"} ios_config "ip dhcp pool POOL1" "network 10.0.0.0 255.0.0.0" "reserved-only" "default-router 10.10.0.254" #    48  IP-,   .  for {set i 1} {$i <= 48} {incr i} {ios_config "ip dhcp pool POOL1" "address 10.0.$sw_num.$i client-id Gi1/0/$i ascii"} # 

Catatan 1. Ada kesalahan logis kecil dalam skrip ini. Cobalah untuk menemukannya.

Catatan 2. Beberapa editor teks ingin menempatkan karakter EoF yang tidak dapat dicetak pada akhir file. Itu bisa dilihat di konsol iOS dengan mencantumkan isi file dengan cat atau lebih. Setelah menemukan EoF, juru bahasa Tcl akan melakukan kesalahan dan mengabaikan seluruh baris. Karena itu, saya meninggalkan tanda komentar di akhir skrip.

Muncul pertanyaan: bagaimana saya bisa menulis skrip ke memori switch dengan IP yang tidak dikonfigurasi, hanya bekerja melalui port konsol? Jangan mengetik naskah dengan tangan! Apakah mungkin untuk mengkonfigurasi Antarmuka Manajemen secara manual dan menggunakan FTP setiap kali? Tidak, ini bisa lebih mudah. Cisco IOS dapat menyalin file secara langsung melalui port serial konsol menggunakan protokol Xmodem dan menyimpannya ke flash. Untuk melakukan ini, Anda memerlukan emulator terminal dengan dukungan Xmodem, misalnya, ZOC atau Tera Term (tetapi Putty gratis yang populer, sayangnya, tidak akan berfungsi!). Menyalin dilakukan oleh copy IOS xmodem: flash: perintah nama file , setelah itu Anda perlu melakukan Transfer File di menu terminal emulator:

gambar

Ini juga dapat dilakukan saat dalam ROMmon (misalnya, jika Anda "merobohkan" sakelar konfigurasi tanpa kata sandi EXEC yang sudah di-priveleged). Tetapi menyalin file kembali (dari memori flash dari saklar ke PC) tidak didukung.

Sayangnya, dari Tcl, Anda tidak dapat membuka sesi telnet ke router jarak jauh. Sambil berusaha
sw(tclsh)#exec "telnet host" hanya akan membeku pada tahap entri kata sandi.

Ini menyimpulkan perjalanan singkat ke kemampuan bahasa Tcl pada platform Cisco IOS, Anda dapat mempelajari masalah ini secara lebih rinci dalam Cisco IOS Scripting dengan dokumen Panduan Konfigurasi TCL yang tersedia di situs web Cisco.

Source: https://habr.com/ru/post/id455401/


All Articles