Automatización da entrada en SecureCRT mediante scripts

Os enxeñeiros de rede adoitan enfrontarse á tarefa de copiar/pegar determinados fragmentos dun bloc de notas á consola. Normalmente tes que copiar varios parámetros: nome de usuario/contrasinal e outra cousa. O uso de scripts permítelle acelerar este proceso. PERO as tarefas de escribir o guión e executar o guión deberían levar menos tempo en total que a configuración manual, se non, os guións son inútiles.

Para que serve este artigo? Este artigo é da serie Fast Start e ten como obxectivo aforrar tempo aos enxeñeiros de rede ao configurar equipos (unha tarefa) en varios dispositivos. Usa o software SecureCRT e a funcionalidade de execución de scripts integrada.

Contido

Introdución

O programa SecureCRT ten un mecanismo de execución de scripts incorporado. Para que serven os scripts de terminal?

  • E/S automatizada e validación mínima de E/S.
  • Acelera a execución de tarefas rutineiras, reducindo as pausas entre as configuracións do equipo. (Redución de feito das pausas causadas polo tempo para realizar accións copiar/pasar no mesmo hardware, con 3 ou máis fragmentos de comandos para aplicar ao hardware).

Este documento recolle as tarefas:

  • Creación de guións sinxelos.
  • Execución de scripts en SecureCRT.
  • Exemplos de uso de scripts sinxelos e avanzados. (Práctica desde a vida real).

Creación de guións sinxelos.

Os scripts máis sinxelos usan só dous comandos, Send e WaitForString. Esta funcionalidade é suficiente para o 90% (ou máis) das tarefas realizadas.

Os scripts poden funcionar en Python, JS, VBS (Visual Basic), Perl, etc.

Pitão

# $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 un ficheiro coa 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 un ficheiro coa extensión "*.vbs"

Crea un script usando unha entrada de script.

Permite automatizar o proceso de escritura dun script. Comezas a escribir un guión. SecureCRT rexistra os comandos e a resposta do hardware posterior e mostra o script rematado por ti.

A. Comeza a escribir o guión:
Menú SecureCRT => Script => Iniciar script de gravación
b. Realice accións coa consola (realice os pasos de configuración na CLI).
V. Remate de escribir o guión:
Menú SecureCRT => Script => Deter o script de gravación...
Garda o ficheiro de script.

Exemplo de comandos executados e script gardado:

Automatización da entrada en SecureCRT mediante scripts

Execución de scripts en SecureCRT.

Despois de crear/editar o guión, xorde unha pregunta lóxica: Como aplicar o guión?
Hai varias maneiras:

  • Execución manual desde o menú Script
  • Inicio automático despois da conexión (script de inicio de sesión)
  • Inicio de sesión automático sen utilizar un script
  • Activación manual cun botón en SecureCRT (aínda non se creou e engadiu un botón a SecureCRT)

Execución manual desde o menú Script

Menú SecureCRT => Script => Executar...
- Lémbranse os últimos 10 scripts e están dispoñibles para un inicio rápido:
Menú SecureCRT => Script => 1 "Nome do ficheiro de script"
Menú SecureCRT => Script => 2 "Nome do ficheiro de script"
Menú SecureCRT => Script => 3 "Nome do ficheiro de script"
Menú SecureCRT => Script => 4 "Nome do ficheiro de script"
Menú SecureCRT => Script => 5 "Nome do ficheiro de script"

Inicio automático despois da conexión (script de inicio de sesión)

A configuración do script de rexistro automático está configurada para a sesión gardada: Conexión => Accións de inicio de sesión => Script de inicio de sesión

Automatización da entrada en SecureCRT mediante scripts

Inicio de sesión automático sen utilizar un script

É posible introducir automaticamente o nome de usuario do contrasinal sen escribir un script, utilizando só a funcionalidade integrada de SecureCRT. Na configuración de conexión "Conexión" => Accións de inicio de sesión => Inicio de sesión automatizado - cómpre encher varios paquetes - o que significa os pares: "Texto esperado" + "Caracteres enviados a este texto" pode haber moitos destes pares. (Exemplo: primeiro par esperando o nome de usuario, segundo esperando contrasinal, terceiro esperando polo modo privilexiado, cuarto par para o contrasinal do modo privilexiado).

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

Automatización da entrada en SecureCRT mediante scripts

Activación manual cun botón en SecureCRT (aínda non se creou e engadiu un botón a SecureCRT)

En SecureCRT, pode asignar un script a un botón. O botón engádese a un panel especialmente creado para este fin.

A. Engadindo un panel á interface: Menú SecureCRT => Ver => Barra de botóns
b. Engade un botón ao panel e engade un script. - Fai clic co botón dereito na barra de botóns e selecciona "Novo botón..." no menú contextual.
V. No cadro de diálogo "Botón de mapa", no campo "Acción", seleccione a acción (función) "Executar script".
Especifique un título para o botón. A cor da icona do botón. Finaliza a configuración facendo clic en Aceptar.

Automatización da entrada en SecureCRT mediante scripts

Nota:

O panel con botóns é unha funcionalidade moi útil.

1. É posible, ao iniciar sesión nunha sesión específica, especificar que panel abrir nesta pestana por defecto.

2. É posible establecer accións predefinidas para accións estándar con equipos: mostrar a versión, mostrar a configuración en execución, gardar a configuración.

Automatización da entrada en SecureCRT mediante scripts
Non hai ningún script anexado a estes botóns. Só liña de acción:

Automatización da entrada en SecureCRT mediante scripts
Configuración - para que ao cambiar a unha sesión, ábrase o panel necesario con botóns na configuración da sesión:

Automatización da entrada en SecureCRT mediante scripts
Ten sentido que o cliente configure scripts individuais para o inicio de sesión e vaia ao panel con comandos frecuentes para o vendedor.

Automatización da entrada en SecureCRT mediante scripts
Cando preme o botón Go Cisco, o panel cambia á barra de botóns de Cisco.

Automatización da entrada en SecureCRT mediante scripts

Exemplos de uso de scripts sinxelos e avanzados. (Práctica desde a vida real).

Os guións sinxelos son suficientes para case todas as ocasións. Pero unha vez necesitaba complicar un pouco o guión, acelerar o traballo. Esta complicación só solicitou datos adicionais nun cadro de diálogo do usuario.

Solicitando datos ao usuario mediante un cadro de diálogo

Tiven 2 no script de solicitude de datos. Este é o nome de host e o cuarto octeto do enderezo IP. Para realizar esta acción, busquei en Google como facelo e atopeino no sitio web oficial de SecureCRT (vandyke). - a funcionalidade chámase 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(" 23r")
	crt.Screen.Send("quitr")
	crt.Screen.Send("sysname ")
	crt.Screen.Send(hostnamestr)
	crt.Screen.Send("r") 

Esta parte do script pediu o nome de host e os números do último octeto. Xa que había 15 equipos. E os datos presentáronse nunha táboa, despois copiei os valores da táboa e pegueinos nas caixas de diálogo. Ademais, o guión funcionou de forma independente.

Copia FTP a equipos de rede.

Este script lanzou a miña xanela de comandos (shell) e copiou datos vía FTP. Ao final, pecha a sesión. É imposible usar o bloc de notas para iso, porque a copia leva moito tempo e os datos do búfer FTP non se almacenarán durante tanto tempo:

# $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()

Introducir nome de usuario/contrasinal mediante un script

Nun cliente, o acceso directo ao equipo de rede foi pechado. Era posible entrar no equipo conectándose primeiro á Pasarela predeterminada, e desde ela ao equipo conectado a ela. Utilizouse o cliente ssh integrado no software IOS/hardware para conectarse. En consecuencia, o nome de usuario e o contrasinal foron solicitados na consola. Co seguinte script, introducíronse automaticamente o nome de usuario e o contrasinal:

# $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. Un para a conta de administrador, o segundo para a conta eSIGHT.

Script coa capacidade de engadir datos directamente durante a execución do script.

A tarefa consistía en engadir unha ruta estática en todos os equipos de rede. Pero a pasarela a Internet en cada equipo era diferente (e difería da pasarela predeterminada). O seguinte script mostrou a táboa de enrutamento, entrou no modo de configuración, non escribiu o comando ata o final (o enderezo IP da pasarela a Internet) - Engadín esta parte. Despois de premer Intro, o script continuou executando o 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()

Neste script, na liña: crt.Screen.Send("ip route 10.10.10.8 255.255.255.252") non se engade o enderezo IP da pasarela e non hai carácter de retorno de carro. O script está esperando a seguinte liña cos caracteres "(config) #" Estes caracteres apareceron despois de que introducín o enderezo IP e introducín.

Conclusión:

Ao escribir un guión e executalo, débese seguir a regra: O tempo para escribir un guión e executalo nunca debe ser superior ó tempo teoricamente dedicado a facer o mesmo traballo manualmente (copiar/pegar desde un bloc de notas, escribir e depurar un manual para ansible, escribir e depurar scripts en Python). É dicir, o uso do script debería aforrar tempo e non perder tempo na automatización puntual dos procesos (é dicir, cando o script é único e non haberá máis repetición). Pero se o script é único e a automatización co script e a escritura/depuración do script leva menos tempo que facelo doutro xeito (ansible, xanela de comandos), entón o script é a mellor solución.
Depurando un script. O script crece gradualmente, a depuración realízase no primeiro, segundo e terceiro dispositivo e, no cuarto, probablemente o script estea totalmente operativo.

Executar un script (introducindo nome de usuario+contrasinal) co rato adoita ser máis rápido que copiar o nome de usuario e o contrasinal dun bloc de notas. Pero non é seguro dende o punto de vista da seguridade.
Outro exemplo (real) cando se usa un script: Non tes acceso directo ao equipo de rede. Pero hai que configurar todos os equipos de rede (traelo ao sistema de vixilancia, configure un nome de usuario/contrasinal/snmpv3nome de usuario/contrasinal adicional). Hai acceso cando vas ao interruptor Core, desde el abres SSH a outros equipos. Por que non podes usar Ansible. - Porque atopámonos cun límite no número de sesións simultáneas permitidas nos equipos de rede (liña vty 0 4, interface de usuario vty 0 4) (outra pregunta é como iniciar diferentes equipos en Ansible co mesmo primeiro salto SSH).

O script reduce o tempo durante operacións longas, por exemplo, copiando ficheiros a través de FTP. Despois de completar a copia, o script comeza a funcionar inmediatamente. Unha persoa terá que ver o final da copia, despois darse conta do final da copia e introducir os comandos adecuados. O guión faino obxectivamente máis rápido.

Os scripts son aplicables onde é imposible utilizar ferramentas de entrega masiva de datos: Consola. Ou cando algúns dos datos do equipo son únicos: nome de host, enderezo IP de xestión. Ou cando se escribe un programa e se depura é máis difícil que engadir datos recibidos do equipo mentres se está a executar o script. - Un exemplo cun script para prescribir unha ruta, cando cada equipo ten o seu propio enderezo IP do provedor de Internet. (Os meus colegas escribiron tales guións - cando o DMVPN falaba era máis de 3. Era necesario cambiar a configuración DMVPN).

Caso práctico: Configurar as opcións iniciais nun novo interruptor usando os portos da consola:

R. Conectou o cable da consola ao dispositivo.
B. Executar o script
B. Agardou a execución do guión
D. Conectou o cable da consola ao seguinte dispositivo.
E. Se o interruptor non é o último, vai ao paso B.

Como resultado do traballo do guión:

  • o contrasinal inicial está definido no equipo.
  • Nome de usuario introducido
  • insírese o enderezo IP exclusivo do dispositivo.

PD: houbo que repetir a operación. Porque o ssh predeterminado non estaba configurado/desactivado. (Si, este é o meu erro.)

Fontes utilizadas.

1. Sobre a creación de scripts
2. Exemplos de guións

Anexo 1: Exemplos de guións.


Un exemplo de script longo, con dúas consultas: nome de host e enderezo IP. Foi creado para predefinir equipos a través da consola (9600 baudios). E tamén para preparar a conexión dos equipos á rede.

# $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()

Estes scripts normalmente non son necesarios, pero a cantidade de equipos é de 15 unidades. Permitiuse unha configuración máis rápida. Foi máis rápido configurar o equipo mediante a xanela Comando SecureCRT.

Configurando unha conta para ssh.

Outro exemplo. A configuración tamén se realiza a través da 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()


Acerca de SecureCRT:Software de pago: desde $ 99 (o prezo máis baixo só é para SecureCRT durante un ano)
Sitio web oficial
Unha licenza de software adquírese unha vez, con soporte (para actualización), entón o software úsase con esta licenza durante un tempo ilimitado.

Funciona en sistemas operativos Mac OS X e Windows.

Hai soporte de script (este artigo)
Ten Ventá de comandos
Sistema operativo Serial/Telnet/SSH1/SSH2/Shell

Fonte: www.habr.com