Imagine que você precisa implantar dezenas de switches de acesso Cisco do mesmo tipo do zero. Uma configuração típica inclui um nome de host e um domínio, um gateway padrão, senhas, uma lista de usuários, endereços IP para SVIs, números de VLAN, configurações para troncos de uplink, etc. Entrar cada vez com as mãos é muito longo e improdutivo. Obviamente, você pode criar uma configuração típica e enviá-la via (T) FTP, mas, primeiro, exigirá pelo menos uma configuração mínima do console e, em segundo lugar, os parâmetros de configuração mutáveis ainda precisam ser alterados. Para resolver essas (assim como muitas outras) tarefas, o Cisco IOS contém uma poderosa ferramenta de automação - um intérprete Tcl integrado (script do Cisco IOS com Tcl).
O que é Tcl
Tcl (legível "tickle", às vezes "fluida") é uma linguagem de programação interpretada desenvolvida no final dos anos 80 para incorporação em aplicativos de console. A gama de recursos do Tcl moderno é bastante ampla: aqui há suporte para OOP e ferramentas avançadas de regexp, matrizes dinâmicas etc.
O suporte para esse idioma apareceu pela primeira vez na plataforma Cisco IOS 12.2 (3) T (em algumas fontes, é indicado em 12.3 (2), mas não encontrei confirmação disso) e atualmente possui várias opções:
- Intérprete Tcl com interface de linha de comando. Está integrado em várias versões da plataforma Cisco IOS, incluindo IOS XE e XR, e está disponível para uma ampla gama de dispositivos. Permite executar comandos Tcl, executar scripts prontos como arquivos, etc. Os dispositivos que não usam o iOS como sistema operacional, mas, por exemplo, Cat OS ou ASA (no firewall com o mesmo nome) não contêm o interpretador da linha de comando.
- T.N. “Gerenciador de eventos embutido” ou EEM - um sistema de rastreamento de eventos que permite que você responda automaticamente a eles em tempo real. Por exemplo, monitore um host remoto com uma notificação por email. Os scripts EEM (applets) são gravados em Tcl, mas o próprio EEM não fornece uma linha de comando Tcl separada. Um exemplo de uso veja aqui . O EEM está disponível nas plataformas Nexus (NX OS) e ASA da versão 9.2 (1) e superior.
- Sistemas de menus de voz IVR (resposta interativa por voz).
Como determinar a presença de um intérprete de comando que conhece o modelo ou a versão do dispositivo do iOS? Há um
Cisco Feature Navigator para isso :

O item de menu
Recursos de pesquisa permite selecionar uma versão específica do IOS para uma determinada liberação do trem do IOS ou uma plataforma de hardware específica. O item de menu
Software de Pesquisa permite encontrar todas as versões do iOS com suporte a Tcl para um determinado hardware. Clicamos, filtramos o campo Filtrar por pelo nome (nome do recurso) “Cisco IOS scripting w / Tcl” (ou simplesmente “Tcl”), adicionamos o nome do recurso à lista, selecione Train release e obtenha uma lista de todas as versões do IOS que contêm esse recurso:

Infelizmente, o banco de dados CFN está incompleto e às vezes não mostra todas as informações. Portanto, para a plataforma CAT2960S, o navegador mostrou a presença de Tcl na versão IOS 15.2E1 e não foi exibida na versão 15.2E9, embora na verdade o intérprete Tcl esteja lá e ali.
O que pode ser feito no Cisco IOS usando o Tcl? Bastante: navegue e altere a configuração, crie scripts interativos, opere em objetos MIB, soquetes TCP e UDP e até ...
escreva um shell da Web inteiro!Em geral, um programa Tcl contém uma sequência de comandos separados por uma nova linha ou ponto e vírgula. Exemplo não explicativo:
puts "Hello, world!"; puts "My first Tcl IOS script!"
Alguns operadores:
#
comentário até o final da linha
set a 1
atribuição a = 1
$a
obtendo o valor de uma variável
{ }
block statement - define o corpo do loop ou condição
[ ]
operador de substituição - quando executado, em vez de colchetes, o valor calculado da expressão contida neles será substituído
== <= <>
operadores de comparação
puts "text"
exibe a string "texto" em stdout (ou seja, no console)
puts $a
mesma forma para o valor de um
gets stdin
lê valores do console
set a [gets stdin]
insira um valor no console e atribua sua variável a
for {set i 1} {$i < 10} {inrc i} {....}
para o loop for
proc {argument, ....} {body}
Para uma lista mais completa, consulte
progopedia.ru/language/tclO intérprete Tcl é iniciado pelo comando tclsh no modo EXEC priveleged:
sw#Tclsh sw(tcl)#
Execute o primeiro script:

Sair do intérprete é o comando
tclquit
ou simplesmente sair. Tcl faz distinção entre maiúsculas e minúsculas; portanto,
Puts "Hello, world"
lançará um erro, mas o registro do shell do IOS não é importante. Todos os comandos de entrada são processados primeiro pelo interpretador Tcl, se o comando de entrada for executável com isso. Tcl, ele é executado e o resultado é enviado para o dispositivo TTY. Se o comando não puder ser executado pelo intérprete, ele será passado para o analisador de comandos do IOS. Assim, um script pode combinar instruções Tcl e comandos IOS. O ambiente do IOS não contém um editor de texto completo; portanto, os scripts predefinidos devem ser criados por meios externos e somente depois copiados para o flash ou a memória. Ele também suporta a pré-compilação do script no bytecode com o lançamento subsequente. O lançamento do arquivo de script é executado pelo comando
tclsh flash:filename
São permitidas várias sessões de intérpretes Tcl de diferentes sessões TTY.
Comandos internos do interpretador Tcl:
exec - Executa o comando citado do conjunto EXEC priveleged da CLI do IOS.
sw(tcl)#exec "show int fa0"
:
ios-config - executa um comando no modo de configuração global. Por trás disso, entre aspas separadas, todos os comandos de subconfiguração subsequentes são indicados. Por exemplo:
sw(tcl)#ios_config "int fa0" "ip address 192.168.0.1 255.255.255.0" "no shut"
equivalente a uma série de comandos do 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
O intérprete Tcl impede que os processos exec interajam diretamente com o console. Portanto, a transferência de dados para processos exec iniciados a partir do shell Tcl ocorre usando o
comando typeahead :
typeahead "y\ny"
exec "reload"
Primeiro, dois caracteres “y” serão armazenados no buffer de entrada, separados por uma nova linha (\ n), em seguida, o comando reload exec será iniciado, o qual lerá o comando cancelar ou confirmará o reset no buffer de entrada e (se necessário) salvará a configuração.
O tickle não suporta digitação, isso deve ser lembrado ao operar com variáveis:

O operador aninhado
[expr {..}]
calcula o valor da expressão especificada entre colchetes ($ a + $ b) e executa a substituição desse valor em vez de colchetes.
Exemplo de procedimento no Tcl:
proc ping_net {x} {
for {set n 1} {$n < $x} {incr n} {
exec "ping 192.168.0.$n"
}
}
Quando você insere uma chave, o intérprete não fecha a linha de comando até que você insira um par de chaves. O procedimento é armazenado na memória do intérprete até o final da sessão do intérprete com o comando tclquit. Isso possibilita iniciar procedimentos e acessar variáveis de scripts lançados anteriormente. Lembre-se de que um erro no script pode levar ao loop e ao bloqueio da sua sessão (V) TTY! O console não possui recursos de desligamento de emergência (como Ctrl + Break), a única maneira é iniciar uma nova sessão e
clear line
sessão "congelada" com o comando
clear line
.
Agora vamos à solução de um problema prático. Antes de nós está o Cat2950S de 48 portas pronto para uso. O script abaixo
- solicita ao console o número de série do comutador sw_num
- define o nome do host para ele no formato switch_ <sw_num>
- solicita e define uma senha para o console EXEC priveleged
- configura o endereço na interface de controle Fa0 (192.168.0.x) e na interface Vlan1 (10.0.x.254) de acordo com o número do comutador inserido
- cria uma reserva DHCP baseada em porta e um pool de 48 endereços, no qual um endereço IP é reservado para cada cliente, cujo octeto inferior é igual ao número de série da porta pela qual esse cliente está conectado.
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. Há um pequeno erro lógico neste script. Tente encontrá-la.
Nota 2. Alguns editores de texto gostam de colocar um caractere EoF não imprimível no final do arquivo. Pode ser visto no console do IOS listando o conteúdo do arquivo com cat ou mais. Tendo tropeçado no EoF, o intérprete Tcl lançará um erro e ignorará toda a linha. Portanto, deixei uma marca de comentário de escape no final do script.
Surge a pergunta: como posso escrever um script na memória de um switch com um IP não configurado, funcionando apenas através da porta do console? Não digite o script manualmente! É possível configurar manualmente a Interface de Gerenciamento e usar o FTP toda vez? Não, pode ser mais fácil. O Cisco IOS pode copiar arquivos diretamente através da porta serial do console usando o protocolo Xmodem e salvá-los em um flash. Para fazer isso, você precisa de um emulador de terminal com suporte ao Xmodem, por exemplo, ZOC ou Tera Term (mas a popular Putty gratuita, infelizmente, não funcionará!). A cópia é realizada pelo comando IOS
copy xmodem: flash: filename , após o qual é necessário executar a Transferência de arquivos no menu do emulador de terminal:

Isso também pode ser feito no ROMmon (por exemplo, se você "desmontar" a configuração do switch sem uma senha EXEC com privilégios particulares). Mas a cópia de arquivos de volta (da memória flash do switch para o PC) não é suportada.
Infelizmente, do Tcl, você não pode abrir uma sessão de telnet para um roteador remoto. Enquanto tenta
sw(tclsh)#exec "telnet host"
congelará no estágio de entrada da senha.
Isso conclui a breve excursão aos recursos da linguagem Tcl na plataforma Cisco IOS; você pode estudar a questão em mais detalhes no documento do Cisco IOS Scripting with TCL Configuration Guide disponível no site da Cisco.