Automatize a entrada no SecureCRT usando scripts

Os engenheiros de rede geralmente têm a tarefa de copiar / colar certos fragmentos do bloco de notas no console. Geralmente, você precisa copiar alguns parâmetros: Nome de usuário / Senha e mais alguma coisa. O uso de scripts permite acelerar esse processo. MAS as tarefas de escrita e execução de scripts no total devem levar menos tempo que a configuração manual, caso contrário, os scripts são inúteis.

Para que serve este artigo? Este artigo é do ciclo de Início Rápido e tem como objetivo economizar tempo para os engenheiros de rede ao configurar equipamentos (uma tarefa) em vários dispositivos. Ele usa o software SecureCRT e a funcionalidade de execução de script embutida.



Introdução


Um mecanismo de execução de script é incorporado ao programa SecureCRT a partir da caixa. Por que precisamos de scripts no terminal:

  • Entrada e saída automatizadas e verificação mínima da correção da entrada / saída.
  • Para acelerar o desempenho de tarefas rotineiras - reduzindo as pausas entre a configuração do equipamento. (Redução de fato das pausas causadas pelo tempo para copiar / ações anteriores no mesmo equipamento, com 3 ou mais fragmentos de comandos para uso no equipamento.)

Este documento descreve as tarefas:

  • Criando scripts simples.
  • Executando scripts no SecureCRT.
  • Exemplos de uso de scripts simples e avançados. (Prática da vida real.)


Criando scripts simples.


Os scripts mais simples usam apenas dois comandos Send e WaitForString. Essa funcionalidade é suficiente para 90% (ou mais) das tarefas executadas.

Os scripts podem funcionar em 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("admin\r")
  crt.Screen.WaitForString("Password:")
  crt.Screen.Send("Password")
  crt.Screen.Synchronous = False
main()

Geralmente um arquivo com a extensão "* .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

Geralmente um arquivo com a extensão "* .vbs"

Criando um script escrevendo um script.


Permite automatizar o processo de gravação de um script. Você inicia a gravação do script. O SecureCRT registra os comandos e a resposta subsequente do equipamento e exibe um script pronto.

e. Executar gravação de script:
Menu SecureCRT => Script => Iniciar gravação de script
b. Execute ações com o console (execute as etapas de configuração na CLI).
às. Para concluir a gravação do script:
Menu SecureCRT => Script => Parar gravação de script ...
Salve o arquivo com o script.

Exemplo de comandos executados e script salvo:



Executando scripts no SecureCRT.


Após criar / editar o script, surge uma pergunta lógica: como aplicar o script?
Existem várias maneiras:

  • Início manual a partir do menu Script
  • Início automático após a conexão (script de logon)
  • Logon automático sem usar um script
  • Início manual usando um botão no SecureCRT (um botão ainda não foi criado e adicionado ao SecureCRT)


Início manual a partir do menu Script


Menu SecureCRT => Script => Executar ...
- Os últimos 10 scripts são lembrados e estão disponíveis para inicialização rápida:
Menu SecureCRT => Script => 1 "Nome do arquivo com script"
Menu SecureCRT => Script => 2 "Nome do arquivo com script"
Menu SecureCRT => Script => 3
Menu "Nome do arquivo com script" Menu SecureCRT => Script => 4
Menu "Nome do arquivo com script" Menu SecureCRT => Script => 5 "Nome do arquivo com script"

Início automático após a conexão (script de logon)


As configurações do script de log automático são definidas para a sessão salva: Conexão => Ações de Logon => Script de Logon



Logon automático sem usar um script


É possível inserir automaticamente um nome de usuário de senha sem escrever um script usando apenas a funcionalidade incorporada SecureCRT. Nas configurações de conexão "Conexão" => Ações de logon => Automatizar logon - você precisa preencher vários pacotes configuráveis ​​- que envolvem pares: "Texto esperado" + "Caracteres enviados para este texto", pode haver muitos pares. (Exemplo: 1º par aguardando um nome de usuário, segundo aguardando uma senha, terceiro aguardando um convite para o modo privilegiado, quarta senha do modo privilegiado.)

Exemplo de logon automático no Cisco ASA:



Início manual usando um botão no SecureCRT (um botão ainda não foi criado e adicionado ao SecureCRT)


No SecureCRT, você pode especificar um botão de script. O botão é adicionado a um painel criado especialmente para essa finalidade.

e. Adicione um painel à interface: Menu SecureCRT => Exibir => Barra de botões
b. Adicione um botão ao painel e adicione um script. - Clique com o botão direito do mouse na barra de botões e selecione "Novo botão ..." no menu de contexto.
às. Na caixa de diálogo "Botão do mapa", no campo "Ação", selecione a ação (função) "Executar script".
Especifique a assinatura para o botão. Cor para o ícone do botão. Conclua as configurações clicando em OK.



Nota:

A barra de botões é um recurso muito útil.

1. É possível que o Logon indique para uma sessão específica qual painel abrir por padrão nesta guia.

2. Existe a possibilidade de ações padrão com equipamento definirem ações predefinidas: show show version, show running-config, salve a configuração.


Nenhum script está anexado a esses botões. Somente linha com ações:


Configurações - para que, ao alternar para uma sessão, o painel necessário com botões seja aberto nas configurações da sessão:


Faz sentido para o cliente configurar scripts individuais para o Login e ir para o painel com comandos frequentes para o fornecedor.


Quando você clica no botão Cisco Go, o painel muda para a barra de botões Cisco.



Exemplos de uso de scripts simples e avançados. (Prática da vida real.)


Scripts simples são suficientes para quase todas as ocasiões. Mas uma vez eu precisei complicar um pouco o script - para acelerar o trabalho. Essa complicação solicitou apenas dados adicionais na caixa de diálogo ao usuário.

Solicitando dados de um usuário usando uma caixa de diálogo


Eu tinha 2 no script de solicitação de dados.Este é o nome do host e o quarto octeto do endereço IP. Para executar esta ação - pesquisei como fazê-lo e o encontrei no site oficial do SecureCRT (vandyke). - a funcionalidade é chamada 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 do script solicitou o nome do host e os números do último octeto. Desde que o equipamento era 15 PCes. E os dados foram apresentados na tabela, copiei os valores da tabela e colei nas caixas de diálogo. Além disso, o script funcionou de forma independente.

Cópia FTP para equipamentos de rede.


Este script lançou minha janela de comando (shell) e copiou os dados via FTP. Após a conclusão, ele encerrou a sessão. É impossível usar o bloco de notas para isso, porque a cópia leva muito tempo e os dados no buffer FTP não serão armazenados 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()


Digitando nome de usuário / senha usando um script


Em um cliente, o acesso ao equipamento de rede foi diretamente fechado. Você pode acessar o equipamento conectando-se primeiro ao Gateway padrão e, a partir dele, conectando-se ao equipamento conectado a ele. Para conectar, usamos o cliente ssh embutido no equipamento IOS / software. Assim, o nome de usuário e a senha foram solicitados no console. Usando o script abaixo, o nome de usuário e a senha foram inseridos automaticamente:

# $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: o script era 2. Um para a conta de administrador, o segundo para a conta eSIGHT.

Um script com a capacidade de anexar dados diretamente durante a execução do script.


A tarefa era adicionar uma rota estática em todos os equipamentos de rede. Mas o gateway da Internet em cada equipamento tinha o seu próprio (e era diferente do gateway padrão). O script a seguir exibiu a tabela de roteamento, entrou no modo de configuração e não concluiu completamente o comando (endereço IP do gateway na Internet) - adicionei esta parte. Depois de pressionar Enter, o script continuou a executar 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-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()

Neste script, na linha: crt.Screen.Send (“rota ip 10.10.10.8 255.255.255.252„), o endereço IP do gateway não é adicionado e não há caracteres de retorno de carro. O script está aguardando a próxima linha com os caracteres "(config) #". Esses caracteres apareceram depois que eu digitei o endereço IP e digitei.

Conclusão:


Ao escrever um script e executá-lo, a regra certamente deve ser seguida: O tempo para escrever o script e o script nunca deve ser maior do que o tempo gasto teoricamente em fazer o mesmo trabalho manualmente (copiar / colar do bloco de notas, escrever e depurar um manual de instruções, escrita e depuração script python). Ou seja, o uso de um script deve economizar tempo e não perder tempo na automação de processos única (ou seja, quando o script é único e não haverá mais repetição). Mas se o script é único e a automação com o script e a gravação / depuração leva menos tempo que a execução de qualquer outra forma (ansible, janela de comando), o script é a melhor solução.
Depurando um script. O script cresce gradualmente, a depuração ocorre em uma execução no primeiro, segundo, terceiro dispositivo e, no quarto, o script provavelmente estará totalmente operacional.

A execução de um script (com nome de usuário + senha) usando o mouse geralmente é mais rápida do que copiar nome de usuário e senha do bloco de notas. Mas não é seguro do ponto de vista da segurança.
Outro exemplo (real) ao usar um script: Você não tem acesso direto ao equipamento de rede. Mas é necessário configurar todos os equipamentos de rede (adicione ao sistema de monitoramento, configure Nome de usuário / senha / snmpv3username / senha adicionais). Há acesso quando você vai para o comutador Core, a partir do qual abre o SSH para outros equipamentos. Por que você não pode usar o Ansible. - Como encontramos um limite no número de sessões simultâneas permitidas em equipamentos de rede (linha vty 0 4, interface do usuário vty 0 4) (outra questão é como iniciar diferentes equipamentos no Ansible com o mesmo primeiro salto SSH).

O script reduz o tempo durante operações longas - por exemplo, copiar arquivos via FTP. Após a conclusão da cópia, o script começa a funcionar imediatamente. Uma pessoa precisará ver o final da cópia, depois perceber o final da cópia e inserir os comandos apropriados. O script faz isso objetivamente mais rápido.

Os scripts são aplicáveis ​​onde é impossível usar os meios de entrega de dados em massa: Console. Ou quando alguns dos dados para o equipamento são únicos: nome do host, endereço IP de gerenciamento. Ou, ao escrever um programa e depurá-lo, é mais difícil do que adicionar dados recebidos do equipamento enquanto o script está em execução. - Um exemplo com um script para prescrever uma rota, quando cada equipamento possui seu próprio endereço IP de provedor de Internet. (Meus colegas escreveram esses scripts - quando o DMVPN falou por 3 centenas. Era necessário alterar as configurações do DMVPN).

Estudo de caso: Configurações iniciais de um novo comutador através das portas do console:

A. Insirai o cabo do console no dispositivo.
B. Lançou o script
B. Esperou a conclusão do script
G. Desenhou o cabo do console para o próximo dispositivo.
D. Se a opção não for a última, vá para a etapa B.

Total com base nos resultados do script:

  • O equipamento possui uma senha inicial.
  • Nome de usuário digitado
  • inseriu um endereço IP exclusivo para o dispositivo.

PS eu tive que repetir a operação. Porque, por padrão, o ssh não foi configurado / desativado. (Sim, este é o meu erro.)

Fontes usadas.


1. Sobre a criação de scripts
2. Exemplos de scripts

Apêndice 1: Exemplos de scripts.



Um exemplo de script longo, com duas solicitações: Nome do host e endereço IP. Foi criado para pré-ajustar o equipamento através do console (9600 baud). E também para preparar a conexão do equipamento à 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("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()

Esses scripts geralmente não são necessários, mas a quantidade de equipamento é 15. Permitido acelerar a configuração. A configuração adicional do hardware foi mais rápida com a janela Comando SecureCRT.

Configuração da conta para ssh.


Outro exemplo. Configure também através do console.

# $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 o SecureCRT:
: 99$ ( SecureCRT )

1 , ( ), .

Mac OS X Windows.

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

All Articles