Imagine que necesita implementar docenas de conmutadores de acceso Cisco del mismo tipo desde cero. Una configuración típica incluye un nombre de host y un dominio, una puerta de enlace predeterminada, contraseñas, una lista de usuarios, direcciones IP para SVI, números de VLAN, configuraciones para troncales de enlace ascendente, etc. Entrarlo cada vez con las manos es muy largo e improductivo. Por supuesto, puede crear una configuración típica y cargarla a través de (T) FTP, pero, en primer lugar, requerirá al menos una configuración mínima de la consola, y en segundo lugar, los parámetros de configuración mutables aún deben cambiarse. Para resolver estas (y muchas otras) tareas, Cisco IOS contiene una poderosa herramienta de automatización: un intérprete Tcl incorporado (scripting Cisco IOS con Tcl).
¿Qué es el Tcl?
Tcl ("cosquilleo" legible, a veces "fluido") es un lenguaje de programación interpretado desarrollado a finales de los años 80 para incrustarlo en aplicaciones de consola. La gama de características de la Tcl moderna es bastante amplia: aquí hay soporte para OOP y herramientas avanzadas de expresión regular, matrices dinámicas, etc.
El soporte para este idioma apareció por primera vez en la plataforma Cisco IOS 12.2 (3) T (en algunas fuentes se indica en 12.3 (2), pero no encontré confirmación de esto) y actualmente tiene varias opciones:
- Intérprete Tcl con interfaz de línea de comando. Está integrado en varias versiones de la plataforma Cisco IOS, incluidos IOS XE y XR, y está disponible para una amplia gama de dispositivos. Le permite ejecutar comandos Tcl, ejecutar scripts preparados como archivos, etc. Los dispositivos que no usan iOS como sistema operativo pero, por ejemplo, Cat OS o ASA (en el firewall del mismo nombre) no contienen una línea de comando de intérprete.
- T.N. "Administrador de eventos integrado" o EEM: un sistema de seguimiento de eventos que le permite responder automáticamente en tiempo real. Por ejemplo, supervise un host remoto con una notificación por correo electrónico. Las secuencias de comandos EEM (applets) están escritas en Tcl, pero EEM en sí no proporciona una línea de comando Tcl separada. Un ejemplo de uso ver aquí . EEM está disponible en plataformas Nexus (NX OS) y ASA desde la versión 9.2 (1) y superior.
- Sistemas de menú de voz IVR (respuesta de voz interactiva).
¿Cómo determinar la presencia de un intérprete de comandos que conozca el modelo de dispositivo o la versión de iOS? Hay un
navegador de funciones de Cisco para esto :

El elemento de menú
Funciones de investigación le permite seleccionar una versión específica de IOS para una versión de tren IOS dada o una plataforma de hardware específica. El elemento de menú de
Research Software le permite encontrar todas las versiones de iOS con soporte Tcl para un hardware determinado. Hacemos clic, filtramos el campo Filtrar por por el nombre (nombre de la función) "Cisco IOS scripting w / Tcl" (o simplemente "Tcl"), agregamos el nombre de la función a la lista, seleccionamos Liberación del tren y obtenemos una lista de todas las versiones de IOS que contienen esta función:

Desafortunadamente, la base de datos de CFN está incompleta y algunas veces no muestra toda la información. Entonces, para la plataforma CAT2960S, el navegador mostró la presencia de Tcl en la versión IOS 15.2E1 y no se mostró en la versión 15.2E9, aunque en realidad el intérprete de Tcl está allí y allí.
¿Qué se puede hacer en Cisco IOS usando Tcl? Bastante: navegue y cambie la configuración, cree scripts interactivos, opere con objetos MIB, sockets TCP y UDP e incluso ... ¡
escriba un shell web completo!En general, un programa Tcl contiene una secuencia de comandos separados por una nueva línea o punto y coma. Ejemplo no explicativo:
puts "Hello, world!"; puts "My first Tcl IOS script!"
Algunos operadores:
#
comentario al final de la línea
set a 1
asignación
set a 1
a = 1
$a
obteniendo el valor de una variable
{ }
instrucción de bloque: define el cuerpo del bucle o condición
Operador de sustitución
[ ]
: cuando se ejecuta, en lugar de corchetes, el valor calculado de la expresión contenida en ellos será sustituido
== <= <>
operadores de comparación
puts "text"
muestra la cadena "texto" en stdout (es decir, en la consola)
puts $a
manera similar por el valor de un
gets stdin
lee valores de la consola
set a [gets stdin]
ingrese un valor desde la consola y asigne su variable a
for {set i 1} {$i < 10} {inrc i} {....}
para el bucle
procedimiento
proc {argument, ....} {body}
Para obtener una lista más completa, consulte
progopedia.ru/language/tclEl intérprete Tcl se inicia con el comando tclsh desde el modo EXEC privilegiado:
sw#Tclsh sw(tcl)#
Ejecute el primer script:

Salir del intérprete es el comando
tclquit
o simplemente salir. Tcl distingue entre mayúsculas y minúsculas, por lo que
Puts "Hello, world"
arrojará un error, pero el registro de shell del shell IOS no es importante. Todos los comandos de entrada son procesados primero por el intérprete Tcl, si el comando de entrada es ejecutable, etc. Tcl, se ejecuta y el resultado se envía al dispositivo TTY. Si el intérprete no puede ejecutar el comando, se pasa al analizador de comandos IOS. Por lo tanto, un script puede combinar sentencias Tcl y comandos IOS. El entorno IOS no contiene un editor de texto completo, por lo que los scripts predefinidos deben crearse por medios externos y solo luego copiarse en flash o en memoria. También es compatible con la precompilación de la secuencia de comandos en bytecode con posterior lanzamiento. El inicio del archivo de script se ejecuta mediante el comando
tclsh flash:filename
Se permiten múltiples sesiones de intérprete de Tcl de diferentes sesiones de TTY.
Comandos internos del intérprete Tcl:
exec : ejecuta el comando entre comillas del conjunto EXEC privilegiado de CLI de IOS.
sw(tcl)#exec "show int fa0"
:
ios-config : ejecuta un comando desde el modo de configuración global. Detrás, en comillas separadas, se indican todos los comandos de subconfiguración posteriores. Por ejemplo:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
equivalente a una serie de comandos de 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
El intérprete Tcl evita que los procesos ejecutivos interactúen directamente con la consola. Por lo tanto, la transferencia de datos a procesos exec iniciados desde el shell Tcl ocurre usando el
comando typeahead :
typeahead "y\ny"
exec "reload"
Primero, se almacenarán dos caracteres "y" en el búfer de entrada, separados por una nueva línea (\ n), luego se iniciará el comando reload exec, que leerá el comando cancelar o confirmar reinicio del búfer de entrada y (si es necesario) guardar la configuración.
El cosquilleo no admite la escritura, esto debe recordarse cuando se opera con variables:

El operador anidado
[expr {..}]
calcula el valor de la expresión especificada entre llaves ($ a + $ b) y realiza la sustitución de este valor en lugar de corchetes.
Procedimiento de ejemplo en Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}
cuando ingresa una llave, el intérprete no cerrará la línea de comando hasta que ingrese un par de llaves de cierre. El procedimiento se almacena en la memoria del intérprete hasta el final de la sesión del intérprete con el comando tclquit. Esto hace posible iniciar procedimientos y acceder a variables de scripts lanzados anteriormente. ¡Recuerde que un error en la secuencia de comandos puede hacer que se repita y bloquee su sesión (V) TTY! La consola no tiene instalaciones de apagado de emergencia (como Ctrl + Break), la única forma es iniciar una nueva sesión y
clear line
sesión "congelada" con el comando de
clear line
.
Ahora pasemos a resolver un problema práctico. Ante nosotros está el Cat2950S de 48 puertos fuera de la caja. El guión a continuación
- solicita de la consola el número de serie del conmutador sw_num
- establece el nombre de host para el formulario switch_ <sw_num>
- solicita y establece una contraseña para la consola EXEC privilegiada
- configura la dirección en su interfaz de control Fa0 (192.168.0.x) y la interfaz Vlan1 (10.0.x.254) de acuerdo con el número de interruptor ingresado
- crea una reserva DHCP basada en puerto y un grupo de 48 direcciones, en la que se reserva una dirección IP para cada cliente, cuyo octeto inferior es igual al número de serie del puerto a través del cual se conecta este cliente.
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"} #
Nota 1. Hay un pequeño error lógico en este script. Intenta encontrarla.
Nota 2. A algunos editores de texto les gusta poner un carácter EoF no imprimible al final del archivo. Se puede ver en la consola IOS enumerando el contenido del archivo con cat o más. Habiendo tropezado con EoF, el intérprete de Tcl arrojará un error e ignorará toda la línea. Por lo tanto, dejé una marca de comentario de escape al final del guión.
Surge la pregunta: ¿cómo puedo escribir un script en la memoria de un conmutador con una IP no configurada, trabajando solo a través del puerto de la consola? ¡No escriba el guión a mano! ¿Es posible configurar manualmente la interfaz de administración y usar FTP cada vez? No, puede ser más fácil. Cisco IOS puede copiar archivos directamente a través del puerto serie de la consola utilizando el protocolo Xmodem y guardarlos en un instante. Para hacer esto, necesita un emulador de terminal con soporte para Xmodem, por ejemplo, ZOC o Tera Term (¡pero la popular Putty gratuita, por desgracia, no funcionará!). La copia se realiza mediante el
comando IOS
copy xmodem: flash: filename , después del cual debe realizar la Transferencia de archivos en el menú del emulador de terminal:

Esto también se puede hacer en ROMmon (por ejemplo, si "derriba" la configuración del conmutador sin una contraseña EXEC privilegiada). Pero la copia de archivos (desde la memoria flash del conmutador a la PC) no es compatible.
Desafortunadamente, desde Tcl, no puede abrir una sesión telnet a un enrutador remoto. Mientras intenta
sw(tclsh)#exec "telnet host"
simplemente se congelará en la etapa de ingreso de contraseña.
Esto concluye la breve excursión a las capacidades del lenguaje Tcl en la plataforma Cisco IOS; puede estudiar el problema con más detalle en el documento de la Guía de configuración de Cisco IOS Scripting con TCL disponible en el sitio web de Cisco.