Los ingenieros de red a menudo enfrentan la tarea de copiar y pegar ciertos fragmentos desde un bloc de notas en la consola. Normalmente, hay que copiar varios parámetros: nombre de usuario/contraseña y algo más. El uso de scripts puede acelerar este proceso. PERO la tarea de escribir un script y ejecutar el script en conjunto debe llevar menos tiempo que la configuración manual, de lo contrario, los scripts son inútiles.
¿Para qué sirve este artículo? Este artículo es parte de la serie Fast Start y está dirigido a ahorrar tiempo a los ingenieros de red en la configuración de equipos (una tarea) en varios dispositivos. Se utiliza el software SecureCRT y la funcionalidad integrada para ejecutar scripts.
Contenido
Introducción
SecureCRT viene de fábrica con un mecanismo para ejecutar scripts. ¿Para qué sirven los scripts en la terminal?
- Entrada y salida automatizadas, y verificación mínima de la validez de la entrada/salida.
- Acelerar la ejecución de tareas rutinarias - reducción de pausas entre la configuración del equipo. (De facto, reducción de pausas causadas por el tiempo para realizar acciones de copiar/pegar en el mismo equipo, cuando hay 3 o más fragmentos de comandos para aplicar al equipo.)
En este documento se abordan las siguientes tareas:
- Creación de scripts simples.
- Ejecución de scripts en SecureCRT.
- Ejemplos de uso de scripts simples y avanzados. (Práctica de la vida real.)
Creación de scripts simples.
Los scripts más simples utilizan solo dos comandos: Send y WaitForString. Esta funcionalidad es suficiente para el 90% (o más) de las tareas realizadas.
Los scripts pueden funcionar en lenguajes como Python, JS, VBS (Visual Basic), Perl, etc.
Python
# $language = "Python"
# $interface = "1.0"
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("r")
crt.Screen.WaitForString("name")
crt.Screen.Send("adminr")
crt.Screen.WaitForString("Password:")
crt.Screen.Send("Password")
crt.Screen.Synchronous = False
main()
Normalmente el archivo tiene la extensión «*.py»
VBS
# $language = "VBScript"
# $interface = "1.0"
Sub Main
crt.Screen.Synchronous = True
crt.Screen.Send vbcr
crt.Screen.WaitForString "name"
crt.Screen.Send "cisco" & vbcr
crt.Screen.WaitForString "assword"
crt.Screen.Send "cisco" & vbcr
crt.Screen.Synchronous = False
End Sub
Normalmente el archivo tiene la extensión «*.vbs»
Creación de un script mediante la grabación del mismo.
Permite automatizar el proceso de escritura de un script. Inicias la grabación del script. SecureCRT registra los comandos y la respuesta posterior del equipo, y te muestra el script listo.
a. Iniciar la grabación del script:
Menú SecureCRT => Script => Start Recording Script
b. Realiza acciones en la consola (realiza acciones de configuración en CLI).
c. Terminar la grabación del script:
Menú SecureCRT => Script => Stop Recording Script…
Guardar el archivo con el script.
Ejemplo de comandos realizados y el script guardado:

Ejecución de scripts en SecureCRT.
Después de crear/editar el script, surge la pregunta lógica: ¿Cómo aplicar el script?
Existen varias maneras:
- Ejecutar manualmente desde el menú Script
- Ejecución automática tras la conexión (script de inicio de sesión)
- Inicio de sesión automático sin usar un script
- Ejecución manual mediante un botón en SecureCRT (el botón aún debe ser creado y añadido a SecureCRT)
Ejecutar manualmente desde el menú Script
Menú SecureCRT => Script => Run…
— Los últimos 10 scripts se recuerdan y están disponibles para un lanzamiento rápido:
Menú SecureCRT => Script => 1 «Nombre del archivo del script»
Menú SecureCRT => Script => 2 «Nombre del archivo del script»
Menú SecureCRT => Script => 3 «Nombre del archivo del script»
Menú SecureCRT => Script => 4 «Nombre del archivo del script»
Menú SecureCRT => Script => 5 «Nombre del archivo del script»
Ejecución automática tras la conexión (script de inicio de sesión)
Las configuraciones de script de inicio de sesión automático se establecen para la sesión guardada: Connection => Logon Actions => Logon script

Inicio de sesión automático sin usar un script
Es posible ingresar automáticamente el nombre de usuario y la contraseña sin escribir un script, utilizando solo la funcionalidad integrada de SecureCRT. En la configuración de conexión «Connection» => Logon Actions => Automate logon – es necesario completar varios pares que consisten en: «Texto esperado» + «Símbolos enviados a este texto»; pueden existir muchos pares. (Ejemplo: 1er par espera entrada de nombre de usuario, segundo espera entrada de contraseña, tercero espera el aviso en modo privilegiado, cuarto la contraseña del modo privilegiado.)
Ejemplo de inicio de sesión automático en Cisco ASA:

Ejecución manual mediante un botón en SecureCRT (el botón aún debe ser creado y añadido a SecureCRT)
En SecureCRT se puede asignar un script a un botón. El botón se agrega en una barra creada especialmente para este fin.
a. Agregar la barra en la interfaz: Menú SecureCRT => View => Button Bar
b. Agregamos un botón a la barra y añadimos el script. – Hacemos clic derecho en la barra Button Bar y en el menú contextual seleccionamos la opción «Nuevo botón…».
c. En el cuadro de diálogo «Map Button» en el campo «Action» seleccionamos la acción (function) «Run Script».
Especificamos la etiqueta del botón. Color para el ícono del botón. Terminamos la configuración haciendo clic en Ok.

Nota:
La barra de botones es una funcionalidad muy útil.
1. Hay posibilidad de especificar qué barra abrir por defecto al iniciar sesión en una sesión específica.
2. Hay posibilidad de asignar acciones predefinidas para acciones estándar con el equipo: mostrar show version, show running-config, guardar la configuración.

A estos botones no está vinculado ningún script. Solo una línea con acciones:

La configuración – para que al cambiar a la sesión se abra la barra de botones necesaria se realiza en la configuración de la sesión:

Para el cliente tiene sentido configurar scripts individuales para Login y pasar a la barra con los comandos frecuentes para el proveedor.
![]()
Al hacer clic en el botón Go Cisco, la barra cambia a Cisco Button Bar.

Ejemplos de uso de scripts simples y avanzados. (Práctica de la vida real.)
Con scripts simples es suficiente casi para todos los casos de uso. Pero una vez tuve que complicar un poco el script - para acelerar el trabajo. Esta complicación solo solicitaba datos adicionales en un cuadro de diálogo al usuario.
Solicitud de datos al usuario mediante un cuadro de diálogo
En mi script, había 2 solicitudes de datos. Esto es Hostname y el cuarto octeto de la dirección IP. Para realizar esta acción, busqué en Google cómo hacerlo y encontré en el sitio oficial de SecureCRT (vandyke). – la funcionalidad se llama prompt.
crt.Screen.WaitForString("-Vlanif200]")
hostnamestr = crt.Dialog.Prompt("Ingresa el hostname:", "hostname", "", False)
ipaddressstr = crt.Dialog.Prompt("Ingresa la dirección ip:", "ip", "", False)
crt.Screen.Send("ip address 10.10.10.")
crt.Screen.Send(ipaddressstr)
crt.Screen.Send(" 23r")
crt.Screen.Send("quitr")
crt.Screen.Send("sysname ")
crt.Screen.Send(hostnamestr)
crt.Screen.Send("r")
Esta parte del script solicitaba el Hostname y los números del último octeto. Dado que había 15 equipos y los datos estaban presentados en una tabla, copiaba los valores de la tabla y los pegaba en los cuadros de diálogo. Luego el script funcionaba solo.
Copiado por FTP en equipos de red.
Este script abría una ventana de comandos (shell) y copiaba datos a través de FTP. Al finalizar, cerraba la sesión. No se puede usar un bloc de notas para esto, ya que la copia toma mucho tiempo y los datos en el buffer FTP no se conservarán tanto:
# $language = "Python"
# $interface = "1.0"
# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("ftp 192.168.1.1r")
crt.Screen.WaitForString("Name")
crt.Screen.Send("adminr")
crt.Screen.WaitForString("Password:")
crt.Screen.Send("Passwordr")
crt.Screen.WaitForString("ftp")
crt.Screen.Send("binaryr")
crt.Screen.WaitForString("ftp")
crt.Screen.Send("put S5720LI-V200R011SPH016.patr")
crt.Screen.WaitForString("ftp")
crt.Screen.Send("quitr")
crt.Screen.Synchronous = False
main()
Entrada de nombre de usuario/contraseña mediante un script
Un cliente tenía el acceso al equipo de red cerrado directamente. Se podía acceder al equipo conectándose primero al Gateway por defecto y, desde allí, al equipo conectado a él. Para la conexión se utilizaba el cliente ssh incorporado en iOS/SO del equipo. Por lo tanto, el nombre de usuario y la contraseña se solicitaban en la consola. Con el siguiente script, el nombre de usuario y la contraseña se introducían automáticamente:
# $language = "Python"
# $interface = "1.0"
# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("snmpadminr")
crt.Screen.WaitForString("assword:")
crt.Screen.Send("Passwordr")
crt.Screen.Synchronous = False
main()
Nota: Había 2 scripts. Uno para la cuenta de administrador, y el segundo para la cuenta de eSIGHT.
Script con la capacidad de agregar datos directamente durante la ejecución del script.
La tarea era añadir una ruta estática en todo el equipo de red. Pero el gateway hacia Internet en cada equipo era diferente (y se difería del gateway por defecto). El siguiente script mostraba la tabla de enrutamiento, entraba en modo de configuración y no completaba el comando (dirección IP del gateway a Internet) — esta parte la completaba yo. Después de presionar Enter, el script continuaba ejecutando el comando.
# $language = "Python"
# $interface = "1.0"
# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("Zdes-mogla-bit-vasha-reklamar")
crt.Screen.WaitForString("#")
crt.Screen.Send("show run | inc ip router")
crt.Screen.WaitForString("#")
crt.Screen.Send("conf tr")
crt.Screen.WaitForString("(config)#")
crt.Screen.Send("ip route 10.10.10.8 255.255.255.252 ")
crt.Screen.WaitForString("(config)#")
crt.Screen.Send("endr")
crt.Screen.WaitForString("#")
crt.Screen.Send("copy run star")
crt.Screen.WaitForString("[startup-config]?")
crt.Screen.Send("r")
crt.Screen.WaitForString("#")
crt.Screen.Send("exitr")
crt.Screen.Synchronous = False
main()
En este script, en la línea: crt.Screen.Send(«ip route 10.10.10.8 255.255.255.252 „) falta la dirección IP del gateway y el símbolo de salto de línea. El script espera la aparición de la siguiente línea con los símbolos «(config)#». Estos símbolos aparecían tras que yo introdujera la dirección IP y presionara enter.
Conclusión:
Al escribir el script y ejecutarlo, debe cumplirse la regla: El tiempo de escritura del script y el tiempo de ejecución del script nunca deben ser mayores que el tiempo teórico necesario para realizar el mismo trabajo manualmente (copiar/pegar desde el bloc de notas, escribir y depurar playbook para ansible, escribir y depurar script en python). Es decir, el uso del script debe ahorrar tiempo, y no desperdiciar tiempo en una automatización de procesos única (es decir, cuando el script es único y no habrá repeticiones). Pero si el script es único y la automatización con el script y la escritura/depuración del script toma menos tiempo que hacerlo de otra manera (ansible, ventana de comandos), entonces el script es la mejor solución.
Depuración del script. El script crece gradualmente, la depuración ocurre en la prueba del primer, segundo y tercer dispositivo, y para el cuarto, el script probablemente estará completamente funcional.
La ejecución de un script (introduciendo el username y password) con el mouse generalmente ocurre más rápido que copiar Username y Password desde el bloc de notas. Pero no es seguro en términos de seguridad.
Otro ejemplo (real) de cuándo usar un script: No tiene acceso directo a los equipos de red. Pero es necesario configurar todos los equipos de red (introducir en el sistema de monitoreo, ajustar adicionales Username/password/snmpv3username/password). Tiene acceso cuando ingresa al conmutador Core, desde el cual abre SSH a otros equipos. Por qué no se pueden usar herramientas de Ansible. — Porque nos topamos con la limitación en la cantidad de sesiones simultáneas permitidas en el equipo de red (line vty 0 4, user-interface vty 0 4) (otro tema es cómo en Ansible manejar diferentes equipos con el mismo SSH en el primer salto).
El script reduce el tiempo en operaciones prolongadas, como la copia de archivos por FTP. Una vez finalizada la copia, el script comienza a trabajar de inmediato. A la persona le llevará ver el final de la copia, luego comprender que la copia ha terminado, y después introducir los comandos correspondientes. El script lo hace objetivamente más rápido.
Los scripts son aplicables donde no se pueden utilizar herramientas de entrega masiva de datos: Consola. O cuando parte de los datos para el equipo es única: hostname, dirección IP de gestión. O cuando escribir un programa y depurarlo es más complicado que agregar los datos obtenidos del equipo mientras se ejecuta el script. — Ejemplo con un script para configurar rutas, cuando en cada equipo la dirección IP del proveedor de Internet es diferente. (Mis colegas escribieron tales scripts cuando DMVPN spoke superaba las 300 unidades. Era necesario cambiar la configuración de DMVPN).
Ejemplo de la práctica: Establecer configuraciones iniciales en un nuevo conmutador a través de puertos de consola:
A. Conecté el cable de consola al dispositivo.
B. Ejecuté el script.
C. Esperé a que se completara el script.
D. Desconecté el cable de consola al siguiente dispositivo.
E. Si el switch no es el último, regresar al punto B.
En resumen, al final del trabajo del script:
- se estableció la contraseña inicial en el equipo.
- se introdujo el Username.
- se introdujo la dirección IP única del dispositivo.
P. S. la operación tuvo que repetirse. Porque por defecto, SSH no estaba configurado/apagado. (Sí, fue mi error).
Fuentes utilizadas.
1.
2.
Anexo 1: Ejemplos de scripts.
Ejemplo de un script largo, con dos solicitudes: Nombre de host y dirección IP. Se creó para la configuración previa del hardware a través de la consola (9600 baudios). También para preparar la conexión del equipo a la red.
# $language = "Python"
# $interface = "1.0"
# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("r")
crt.Screen.WaitForString("name")
crt.Screen.Send("adminr")
crt.Screen.WaitForString("Password:")
crt.Screen.Send("Passwordr")
crt.Screen.Send("sysr")
crt.Screen.WaitForString("]")
crt.Screen.Send("interface Vlanif 1r")
crt.Screen.WaitForString("Vlanif1]")
crt.Screen.Send("undo ip addressr")
crt.Screen.Send("shutdownr")
crt.Screen.Send("vlan 100r")
crt.Screen.Send(" description description1r")
crt.Screen.Send(" name description1r")
crt.Screen.Send("vlan 110r")
crt.Screen.Send(" description description2r")
crt.Screen.Send(" name description2r")
crt.Screen.Send("vlan 120r")
crt.Screen.Send(" description description3r")
crt.Screen.Send(" name description3r")
crt.Screen.Send("vlan 130r")
crt.Screen.Send(" description description4r")
crt.Screen.Send(" name description4r")
crt.Screen.Send("vlan 140r")
crt.Screen.Send(" description description5r")
crt.Screen.Send(" name description5r")
crt.Screen.Send("vlan 150r")
crt.Screen.Send(" description description6r")
crt.Screen.Send(" name description6r")
crt.Screen.Send("vlan 160r")
crt.Screen.Send(" description description7r")
crt.Screen.Send(" name description7r")
crt.Screen.Send("vlan 170r")
crt.Screen.Send(" description description8r")
crt.Screen.Send(" name description8r")
crt.Screen.Send("vlan 180r")
crt.Screen.Send(" description description9r")
crt.Screen.Send(" name description9r")
crt.Screen.Send("vlan 200r")
crt.Screen.Send(" description description10r")
crt.Screen.Send(" name description10r")
crt.Screen.Send("vlan 300r")
crt.Screen.Send(" description description11r")
crt.Screen.Send(" name description11r")
crt.Screen.Send("quitr")
crt.Screen.WaitForString("]")
crt.Screen.Send("stp region-configurationr")
crt.Screen.Send("region-name descr")
crt.Screen.Send("active region-configurationr")
crt.Screen.WaitForString("mst-region]")
crt.Screen.Send("quitr")
crt.Screen.Send("stp instance 0 priority 57344r")
crt.Screen.WaitForString("]")
crt.Screen.Send("interface range GigabitEthernet 0/0/1 to GigabitEthernet 0/0/42r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("description Usersr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port link-type hybridr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("voice-vlan 100 enabler")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("voice-vlan legacy enabler")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port hybrid pvid vlan 120r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port hybrid tagged vlan 100r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port hybrid untagged vlan 120r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("stp edged-port enabler")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("trust 8021pr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control action blockr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control enable trapr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("quitr")
crt.Screen.Send("interface range GigabitEthernet 0/0/43 to GigabitEthernet 0/0/48r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("description Printersr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port link-type accessr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port default vlan 130r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("stp edged-port enabler")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("trust 8021pr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control action blockr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control enable trapr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("quitr")
crt.Screen.Send("interface range XGigabitEthernet 0/0/1 to XGigabitEthernet 0/0/2r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("description uplinkr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port link-type trunkr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port trunk allow-pass vlan 100 110 120 130 140 150 160 170 180 200r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("port trunk allow-pass vlan 300r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500r")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control action blockr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("storm-control enable trapr")
crt.Screen.WaitForString("port-group]")
crt.Screen.Send("quitr")
crt.Screen.Send("ntp-service unicast-server 10.10.10.4r")
crt.Screen.Send("ntp-service unicast-server 10.10.10.2r")
crt.Screen.Send("ntp-service unicast-server 10.10.10.134r")
crt.Screen.Send("ip route-static 0.0.0.0 0.0.0.0 10.10.10.254r")
crt.Screen.Send("interface Vlanif 200r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
crt.Screen.Send("r")
crt.Screen.WaitForString("-Vlanif200]")
hostnamestr = crt.Dialog.Prompt("Enter hostname:", "hostname", "", False)
ipaddressstr = crt.Dialog.Prompt("Enter ip address:", "ip", "", False)
crt.Screen.Send("ip address 10.10.10.")
crt.Screen.Send(ipaddressstr)
crt.Screen.Send(" 24r")
crt.Screen.Send("quitr")
crt.Screen.Send("sysname ")
crt.Screen.Send(hostnamestr)
crt.Screen.Send("r")
crt.Screen.WaitForString("]")
crt.Screen.Synchronous = False
main()
Tales scripts generalmente no son necesarios, pero la cantidad de equipos - 15 unidades. Permitió acelerar la configuración. Después, la configuración del hardware fue más rápida utilizando la ventana de comandos de SecureCRT.
Configuración de la cuenta para ssh.
Otro ejemplo. Configuración también a través de la consola.
# $language = "Python"
# $interface = "1.0"
# Connect to a telnet server and automate the initial login sequence.
# Note that synchronous mode is enabled to prevent server output from
# potentially being missed.
def main():
crt.Screen.Synchronous = True
crt.Screen.Send("r")
crt.Screen.WaitForString("name")
crt.Screen.Send("adminr")
crt.Screen.WaitForString("Password:")
crt.Screen.Send("Passwordr")
crt.Screen.WaitForString(">")
crt.Screen.Send("sysr")
crt.Screen.Send("stelnet server enabler")
crt.Screen.Send("aaar")
crt.Screen.Send("local-user admin service-type terminal ftp http sshr")
crt.Screen.Send("quitr")
crt.Screen.Send("user-interface vty 0 4r")
crt.Screen.Send("authentication-mode aaar")
crt.Screen.Send("quitr")
crt.Screen.Send("quitr")
crt.Screen.Synchronous = False
main()
Sobre SecureCRT:Software de pago: desde 99$ (el precio más bajo solo para SecureCRT durante un año)
Se compra una vez la licencia del software, con soporte (para actualizaciones), luego el software se utiliza con esta licencia de forma ilimitada.
Funciona en sistemas operativos Mac OS X y Windows.
Hay soporte para scripts (este artículo)
Hay
Serial/Telnet/SSH1/SSH2/Shell del sistema operativo
Fuente: habr.com
