Automatice la entrada a SecureCRT usando scripts

Los ingenieros de red a menudo tienen la tarea de copiar / pegar ciertos fragmentos del bloc de notas a la consola. Por lo general, debe copiar algunos parámetros: nombre de usuario / contraseña y algo más. El uso de scripts le permite acelerar este proceso. PERO las tareas de escritura de guiones y ejecución de guiones en total deberían tomar menos tiempo que la configuración manual, de lo contrario los guiones son inútiles.

¿Para qué es este artículo? Este artículo pertenece al ciclo de Inicio rápido y tiene como objetivo ahorrar tiempo para los ingenieros de redes al configurar equipos (una tarea) en múltiples dispositivos. Utiliza el software SecureCRT y la funcionalidad de ejecución de script incorporada.



Introducción


Un motor de ejecución de script está integrado en el programa SecureCRT fuera de la caja. ¿Por qué necesitamos scripts en la terminal?

  • Entrada y salida automatizadas, y verificación mínima de la corrección de entrada / salida.
  • Para acelerar el rendimiento de las tareas de rutina, reduciendo las pausas entre la configuración del equipo. (Reducción de facto de pausas causadas por el tiempo para copiar / acciones pasadas en el mismo equipo, con 3 o más fragmentos de comandos para usar en el equipo).

Este documento describe las tareas:

  • Crear guiones simples.
  • Ejecución de scripts en SecureCRT.
  • Ejemplos de uso de scripts simples y avanzados. (Practica desde la vida real).


Crear guiones simples.


Los scripts más simples usan 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 Python, JS, VBS (Visual Basic), Perl, etc.

Pitón


# $language = "Python"
# $interface = "1.0"
def main():
  crt.Screen.Synchronous = True
  crt.Screen.Send("\r")
  crt.Screen.WaitForString("name")
  crt.Screen.Send("admin\r")
  crt.Screen.WaitForString("Password:")
  crt.Screen.Send("Password")
  crt.Screen.Synchronous = False
main()

Por lo general, un archivo con 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

Por lo general, un archivo con la extensión "* .vbs"

Crear un guión escribiendo un guión.


Le permite automatizar el proceso de escribir un guión. Empiezas la grabación del guión. SecureCRT registra los comandos y la respuesta posterior del equipo y muestra un script listo para usar.

y. Ejecutar grabación de script:
Menú SecureCRT => Script => Iniciar grabación de script
b. Realice acciones con la consola (realice los pasos de configuración en la CLI).
a. Para finalizar la grabación del script:
Menú SecureCRT => Script => Detener grabación de script ...
Guarde el archivo con el script.

Ejemplo de comandos ejecutados y script guardado:



Ejecución de scripts en SecureCRT.


Después de crear / editar el script, surge una pregunta lógica: ¿Cómo aplicar el script?
Hay varias formas:

  • Inicio manual desde el menú Script
  • Inicio automático después de la conexión (secuencia de comandos de inicio de sesión)
  • Inicio de sesión automático sin usar un script
  • Inicio manual utilizando un botón en SecureCRT (aún no se ha creado y agregado un botón a SecureCRT)


Inicio manual desde el menú Script


Menú SecureCRT => Script => Ejecutar ...
- Los últimos 10 scripts se recuerdan y están disponibles para inicio rápido:
Menú SecureCRT => Script => 1 "Nombre de archivo con script"
Menú SecureCRT => Script => 2 "Nombre de archivo con script"
Menú SecureCRT => Script => 3
Menú "Nombre de archivo con script" SecureCRT => Script => 4
Menú "Nombre de archivo con script" SecureCRT => Script => 5 "Nombre de archivo con script"

Inicio automático después de la conexión (secuencia de comandos de inicio de sesión)


Las configuraciones para el script de inicio de sesión automático están configuradas para la sesión guardada: Conexión => Acciones de inicio de sesión => Script de inicio de sesión



Inicio de sesión automático sin usar un script


Es posible ingresar automáticamente un nombre de usuario de contraseña sin escribir un script utilizando solo la funcionalidad incorporada de SecureCRT. En la configuración de conexión "Conexión" => Acciones de inicio de sesión => Automatizar el inicio de sesión, debe completar varios paquetes, que involucran pares: "Texto esperado" + "Caracteres enviados a este texto" puede haber muchos de estos pares. (Ejemplo: primer par esperando un nombre de usuario, segundo esperando una contraseña, tercero esperando una invitación al modo privilegiado, cuarta contraseña del modo privilegiado).

Ejemplo de inicio de sesión automático en Cisco ASA:



Inicio manual utilizando un botón en SecureCRT (aún no se ha creado y agregado un botón a SecureCRT)


En SecureCRT, puede especificar un botón de secuencia de comandos. El botón se agrega a un panel especialmente creado para este propósito.

y. Agregue un panel a la interfaz: Menú SecureCRT => Ver => Barra de botones
b. Agregue un botón al panel y agregue un script. - Haga clic derecho en la barra de botones y seleccione "Nuevo botón ..." en el menú contextual.
a. En el cuadro de diálogo "Botón de mapa" en el campo "Acción" Seleccione la acción (función) "Ejecutar script".
Especifique la firma para el botón. Color para el icono del botón. Termine la configuración haciendo clic en Aceptar.



Nota:

La barra de botones es una característica muy útil.

1. Es posible que Logon le indique a una sesión específica qué panel abrir de forma predeterminada en esta pestaña.

2. Existe la posibilidad de que las acciones estándar con el equipo establezcan acciones predefinidas: show show version, show running-config, save the configuration.


No se adjunta ninguna secuencia de comandos a estos botones. Solo línea con acciones:


Configuración: para que al cambiar a una sesión se abra el panel necesario con botones en la configuración de la sesión:


Tiene sentido que el cliente configure scripts individuales para Iniciar sesión y vaya al panel con comandos frecuentes para el proveedor.


Cuando hace clic en el botón Cisco Go, el panel cambia a la barra de botones de Cisco.



Ejemplos de uso de scripts simples y avanzados. (Practica desde la vida real).


Los guiones simples son suficientes para casi todas las ocasiones. Pero una vez que necesitaba complicar un poco el guión, para acelerar el trabajo. Esta complicación solo solicitó datos adicionales en el cuadro de diálogo del usuario.

Solicitar datos de un usuario utilizando un cuadro de diálogo


Tenía 2 en el script de solicitud de datos. Este es el nombre de host y el 4to octeto de la dirección IP. Para realizar esta acción, busqué en Google cómo hacerlo y lo encontré en el sitio web oficial de SecureCRT (vandyke). - la funcionalidad se llama prompt.

	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(" 23\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("\r") 

Esta parte del script solicitó Nombre de host y números del último octeto. Dado que el equipo era de 15 piezas. Y los datos se presentaron en la tabla, luego copié los valores de la tabla y los pegué en los cuadros de diálogo. Además, el guión funcionó de forma independiente.

Copia de FTP a equipos de red.


Este script lanzó mi ventana de comando (shell) y copió los datos a través de FTP. Al finalizar, cerró la sesión. Es imposible usar el bloc de notas para esto, porque la copia lleva mucho tiempo y los datos en el búfer FTP no se almacenará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.1\r")
	crt.Screen.WaitForString("Name")
	crt.Screen.Send("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("binary\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("put S5720LI-V200R011SPH016.pat\r")
	crt.Screen.WaitForString("ftp")
	crt.Screen.Send("quit\r")
	crt.Screen.Synchronous = False
main()


Ingresando nombre de usuario / contraseña usando un script


En un cliente, el acceso al equipo de red se cerró directamente. Puede acceder al equipo conectándose primero a la puerta de enlace predeterminada y luego desde allí, luego conectándose al equipo conectado a ella. Para conectarnos, utilizamos el cliente ssh integrado en el equipo IOS / software. En consecuencia, el nombre de usuario y la contraseña se solicitaron en la consola. Usando el siguiente script, el nombre de usuario y la contraseña se ingresaron 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("snmpadmin\r")
	crt.Screen.WaitForString("assword:")
	crt.Screen.Send("Password\r")
	crt.Screen.Synchronous = False
main()

Nota: El script fue 2. Uno para la cuenta de administrador, el segundo para la cuenta eSIGHT.

Un script con la capacidad de agregar datos directamente durante la ejecución del script.


La tarea consistía en agregar una ruta estática en todos los equipos de red. Pero la puerta de enlace de Internet en cada equipo tenía la suya (y era diferente de la puerta de enlace predeterminada). El siguiente script muestra la tabla de enrutamiento, ingresó al modo de configuración y no completó completamente el comando (dirección IP de la puerta de enlace de Internet). Agregué esta parte. Después de presionar Enter, el script continuó 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-reklama\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("show run | inc ip route\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("conf t\r")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("ip route 10.10.10.8 255.255.255.252 ")
	crt.Screen.WaitForString("(config)#")
	crt.Screen.Send("end\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("copy run sta\r")
	crt.Screen.WaitForString("[startup-config]?")
	crt.Screen.Send("\r")
	crt.Screen.WaitForString("#")
	crt.Screen.Send("exit\r")
	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„), la dirección IP de la puerta de enlace no se agrega y no hay caracteres de retorno de carro. El script está esperando que aparezca la siguiente línea con los caracteres "(config) #". Estos caracteres aparecieron después de que ingresé la dirección IP y la ingresé.

Conclusión:


Cuando se escribe un guión y se ejecuta, la regla debe seguirse: el tiempo para escribir un guión y la ejecución del guión nunca debe ser más largo que el tiempo teóricamente dedicado a hacer el mismo trabajo manualmente (copiar / pegar desde el bloc de notas, escribir y depurar un libro de jugadas para ansible, escribir y depurar secuencia de comandos de Python). Es decir, el uso de un script debería ahorrar tiempo y no perder tiempo en la automatización de procesos por única vez (es decir, cuando el script es único y no habrá más repeticiones). Pero si el script es único y la automatización con el script y la escritura / depuración del script lleva menos tiempo que la ejecución de cualquier otra manera (ansible, ventana de comandos), entonces el script es la mejor solución.
Depuración de un script El script crece gradualmente, la depuración ocurre en una ejecución en el primer, segundo, tercer dispositivo y en el cuarto el script probablemente estará completamente operativo.

Ejecutar un script (con nombre de usuario + contraseña) con el mouse suele ser más rápido que copiar el nombre de usuario y la contraseña del Bloc de notas. Pero no es seguro desde un punto de vista de seguridad.
Otro ejemplo (real) cuando se utiliza un script: no tiene acceso directo al equipo de red. Pero es necesario configurar todos los equipos de red (agregar al sistema de monitoreo, configurar Nombre de usuario / contraseña / snmpv3username / contraseña adicionales). Hay acceso cuando va al conmutador Core, desde el SSH abierto a otro equipo. Por qué no puedes usar Ansible. - Debido a que nos encontramos con un límite en el número de sesiones simultáneas permitidas en el equipo de red (línea vty 0 4, interfaz de usuario vty 0 4) (otra pregunta es cómo iniciar diferentes equipos en Ansible con el mismo primer salto SSH).

El script reduce el tiempo durante operaciones largas, por ejemplo, copiar archivos a través de FTP. Una vez finalizada la copia, el script comienza a funcionar de inmediato. Una persona necesitará ver el final de la copia, luego darse cuenta del final de la copia, luego ingrese los comandos apropiados. El script hace esto objetivamente más rápido.

Los scripts son aplicables donde es imposible utilizar los medios de entrega masiva de datos: Consola. O cuando algunos de los datos del equipo son únicos: nombre de host, dirección IP de administración. O al escribir un programa y depurarlo es más difícil que agregar datos recibidos del equipo mientras se ejecuta el script. - Un ejemplo con un script para prescribir una ruta, cuando cada equipo tiene su propia dirección IP de proveedor de Internet. (Mis colegas escribieron estos scripts, cuando DMVPN habló durante 3 cientos. Era necesario cambiar la configuración de DMVPN).

Estudio de caso: Configuración inicial en un nuevo conmutador a través de los puertos de la consola:

A. Inserté el cable de la consola en el dispositivo.
B. Lancé la secuencia de comandos
B. Espere a que se complete la secuencia de comandos
G. Dibujó el cable de la consola al siguiente dispositivo.
D. Si el cambio no es el último, vaya al paso B.

Total basado en los resultados del script:

  • El equipo tiene una contraseña inicial.
  • Nombre de usuario ingresado
  • ingresó una dirección IP única para el dispositivo.

PD: tuve que repetir la operación. Porque por defecto ssh no estaba configurado / apagado. (Sí, este es mi error).

Fuentes utilizadas


1. Acerca de la creación de guiones
2. Ejemplos de guiones

Apéndice 1: Ejemplos de scripts.



Un ejemplo de una secuencia de comandos larga, con dos solicitudes: nombre de host y dirección IP. Fue creado para preajustar equipos a través de la consola (9600 baudios). Y también para preparar la conexión de equipos 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("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.Send("sys\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface Vlanif 1\r")
	crt.Screen.WaitForString("Vlanif1]")
	crt.Screen.Send("undo ip address\r")
	crt.Screen.Send("shutdown\r")
	crt.Screen.Send("vlan 100\r")
	crt.Screen.Send(" description description1\r")
	crt.Screen.Send(" name description1\r")
	crt.Screen.Send("vlan 110\r")
	crt.Screen.Send(" description description2\r")
	crt.Screen.Send(" name description2\r")
	crt.Screen.Send("vlan 120\r")
	crt.Screen.Send(" description description3\r")
	crt.Screen.Send(" name description3\r")
	crt.Screen.Send("vlan 130\r")
	crt.Screen.Send(" description description4\r")
	crt.Screen.Send(" name description4\r")
	crt.Screen.Send("vlan 140\r")
	crt.Screen.Send(" description description5\r")
	crt.Screen.Send(" name description5\r")
	crt.Screen.Send("vlan 150\r")
	crt.Screen.Send(" description description6\r")
	crt.Screen.Send(" name description6\r")
	crt.Screen.Send("vlan 160\r")
	crt.Screen.Send(" description description7\r")
	crt.Screen.Send(" name description7\r")
	crt.Screen.Send("vlan 170\r")
	crt.Screen.Send(" description description8\r")
	crt.Screen.Send(" name description8\r")               
	crt.Screen.Send("vlan 180\r")
	crt.Screen.Send(" description description9\r")
	crt.Screen.Send(" name description9\r")
	crt.Screen.Send("vlan 200\r")
	crt.Screen.Send(" description description10\r")
	crt.Screen.Send(" name description10\r")
	crt.Screen.Send("vlan 300\r")
	crt.Screen.Send(" description description11\r")
	crt.Screen.Send(" name description11\r")
	crt.Screen.Send("quit\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("stp region-configuration\r")
	crt.Screen.Send("region-name desc\r")
	crt.Screen.Send("active region-configuration\r")
	crt.Screen.WaitForString("mst-region]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("stp instance 0 priority 57344\r")
	crt.Screen.WaitForString("]")
	crt.Screen.Send("interface range GigabitEthernet 0/0/1 to GigabitEthernet 0/0/42\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Users\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type hybrid\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan 100 enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("voice-vlan legacy enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid pvid vlan 120\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid tagged vlan 100\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port hybrid untagged vlan 120\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021p\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("interface range GigabitEthernet 0/0/43 to GigabitEthernet 0/0/48\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description Printers\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type access\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port default vlan 130\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("stp edged-port enable\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("trust 8021p\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("interface range XGigabitEthernet 0/0/1 to XGigabitEthernet 0/0/2\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("description uplink\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port link-type trunk\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 100 110 120 130 140 150 160 170 180 200\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("port trunk allow-pass vlan 300\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control broadcast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control multicast min-rate 1000 max-rate 1500\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control action block\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("storm-control enable trap\r")
	crt.Screen.WaitForString("port-group]")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.4\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.2\r")
	crt.Screen.Send("ntp-service unicast-server 10.10.10.134\r")
	crt.Screen.Send("ip route-static 0.0.0.0 0.0.0.0 10.10.10.254\r")
	crt.Screen.Send("interface Vlanif 200\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]")
	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(" 24\r")
	crt.Screen.Send("quit\r")
	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 equipo es de 15. Permitido acelerar la configuración. La configuración adicional del hardware fue más rápida con la ventana de comandos SecureCRT.

Configuración de 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("admin\r")
	crt.Screen.WaitForString("Password:")
	crt.Screen.Send("Password\r")
	crt.Screen.WaitForString(">")
	crt.Screen.Send("sys\r")
	crt.Screen.Send("stelnet server enable\r")
	crt.Screen.Send("aaa\r")
	crt.Screen.Send("local-user admin service-type terminal ftp http ssh\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("user-interface vty 0 4\r")
	crt.Screen.Send("authentication-mode aaa\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Send("quit\r")
	crt.Screen.Synchronous = False
main()


Sobre SecureCRT:
: 99$ ( SecureCRT )

1 , ( ), .

Mac OS X Windows.

( )
Command Window
Serial/Telnet/SSH1/SSH2/Shell

All Articles