Automazione dell'inserimento in SecureCRT tramite script

I progettisti di reti si trovano spesso di fronte alla necessità di eseguire copy/paste di determinati frammenti da un editor di testo a una console. Di solito è necessario copiare diversi parametri: NomeUtente/Password e qualcos'altro. L'uso di script consente di velocizzare questo processo. Tuttavia, la scrittura e l'esecuzione dello script nel complesso devono richiedere meno tempo rispetto alla configurazione manuale, altrimenti gli script risultano inutili.

A cosa serve questo articolo. Questo articolo fa parte del ciclo Fast Start ed è destinato a risparmiare tempo ai progettisti di reti nella configurazione di attrezzature (un compito) su più dispositivi. Si utilizza il software SecureCRT e le funzionalità incorporate per l'esecuzione di script.

Contenuto

Introduzione

Il software SecureCRT ha integrato un meccanismo per l'esecuzione di script. A cosa servono gli script nel terminale:

  • Input e output automatizzati e verifica minima della correttezza dell'input/output.
  • Accelerare l'esecuzione di compiti di routine – ridurre le pause tra la configurazione dell'attrezzatura. (De facto riduzione delle pause causate dal tempo necessario per eseguire azioni di copy/paste sulla stessa attrezzatura, quando si utilizzano 3 o più frammenti di comandi da applicare sull'attrezzatura.)

In questo documento vengono esaminate le seguenti attività:

  • Creazione di script semplici.
  • Esecuzione di script su SecureCRT.
  • Esempi di utilizzo di script semplici e avanzati. (Pratica dalla vita reale.)

Creazione di script semplici.

Gli script più semplici utilizzano solo due comandi Send e WaitForString. Questa funzionalità è sufficiente per il 90% (e oltre) delle attività eseguite.

Gli script possono essere scritti in Python, JS, VBS (Visual Basic), Perl, ecc.

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

Di solito un file con estensione «*.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

Di solito un file con estensione «*.vbs»

Creazione di uno script mediante la registrazione dello script.

Consente di automatizzare il processo di scrittura dello script. Avvii la registrazione dello script. SecureCRT registra i comandi e la risposta successiva dell'hardware e ti restituisce lo script pronto.

a. Avviare la registrazione dello script:
Menu SecureCRT => Script => Inizia registrazione script
b. Eseguire azioni con la console (eseguire azioni di configurazione nel CLI).
c. Terminare la registrazione dello script:
Menu SecureCRT => Script => Ferma registrazione script...
Salva il file dello script.

Esempio di comandi eseguiti e script salvato:

Automazione dell'inserimento in SecureCRT tramite script

Esecuzione di script su SecureCRT.

Dopo la creazione/modifica dello script, sorge la domanda inevitabile: Come applicare lo script?
Esistono diversi modi:

  • Esecuzione manuale dal menu Script
  • Esecuzione automatica dopo la connessione (script di accesso)
  • Accesso automatico senza utilizzare script
  • Esecuzione manuale tramite un pulsante in SecureCRT (il pulsante deve ancora essere creato e aggiunto a SecureCRT)

Esecuzione manuale dal menu Script

Menu SecureCRT => Script => Esegui...
— Gli ultimi 10 script sono memorizzati e disponibili per un avvio rapido:
Menu SecureCRT => Script => 1 «Nome del file dello script»
Menu SecureCRT => Script => 2 «Nome del file dello script»
Menu SecureCRT => Script => 3 «Nome del file dello script»
Menu SecureCRT => Script => 4 «Nome del file dello script»
Menu SecureCRT => Script => 5 «Nome del file dello script»

Esecuzione automatica dopo la connessione (script di accesso)

Le impostazioni per lo script di accesso automatico sono configurate per la sessione salvata: Connessione => Azioni di logon => Script di logon

Automazione dell'inserimento in SecureCRT tramite script

Accesso automatico senza utilizzare script

C'è la possibilità di inserire automaticamente il nome utente e la password senza scrivere uno script, utilizzando solo le funzionalità integrate di SecureCRT. Nelle impostazioni di connessione «Connessione» => Azioni di logon => Automatizza logon – è necessario compilare alcune coppie di valori – che rappresentano coppie: «Testo atteso» + «Caratteri inviati per questo testo»; ci possono essere molte di queste coppie. (Esempio: la prima coppia attende l'inserimento del nome utente, la seconda attende l'inserimento della password, la terza attende il prompt per la modalità privilegiata, la quarta è la password per la modalità privilegiata.)

Esempio di logon automatico su Cisco ASA:

Automazione dell'inserimento in SecureCRT tramite script

Esecuzione manuale tramite un pulsante in SecureCRT (il pulsante deve ancora essere creato e aggiunto a SecureCRT)

In SecureCRT puoi associare uno script a un pulsante. Il pulsante viene aggiunto a una barra appositamente creata per questo scopo.

a. Aggiungi la barra all'interfaccia: Menu SecureCRT => Vista => Barra dei pulsanti
b. Aggiungi un pulsante alla barra e aggiungi lo script. – Clicca con il tasto destro del mouse sulla barra dei pulsanti e nel menu contestuale seleziona l'opzione «Nuovo pulsante…».
c. Nella finestra di dialogo «Mappa pulsante» nel campo «Azione» seleziona l'azione (funzione) «Esegui script».
Indichiamo la didascalia per il pulsante. Colore per l'icona del pulsante. Terminiamo le impostazioni premendo Ok.

Automazione dell'inserimento in SecureCRT tramite script

Nota:

La barra con i pulsanti è una funzionalità molto utile.

1. È possibile specificare quale barra aprire di default per questa scheda durante il Logon a una sessione specifica.

2. È possibile definire in anticipo azioni standard per l'hardware: mostrare show version, show running-config, salva la configurazione.

Automazione dell'inserimento in SecureCRT tramite script
A questi pulsanti non è associato alcuno script. Solo una riga con le azioni:

Automazione dell'inserimento in SecureCRT tramite script
Impostazione – affinché, passando a una sessione, si apra la barra dei pulsanti necessaria avviene nelle impostazioni della sessione:

Automazione dell'inserimento in SecureCRT tramite script
Per il cliente ha senso impostare script individuali per il Login e passare alla barra con comandi frequenti per il fornitore.

Automazione dell'inserimento in SecureCRT tramite script
Cliccando sul pulsante Go Cisco – la barra si sposta sulla Cisco Button Bar.

Automazione dell'inserimento in SecureCRT tramite script

Esempi di utilizzo di script semplici e avanzati. (Pratica dalla vita reale.)

Script semplici sono sufficienti quasi per tutte le occasioni. Ma una volta mi è servito rendere lo script un po' più complesso – per velocizzare il lavoro. Questo complicamento richiedeva semplicemente di chiedere dati aggiuntivi in una finestra di dialogo all'utente.

Richiesta di dati all'utente tramite finestra di dialogo

Nel mio script avevo 2 richieste di dati. Sono il nome host e il quarto ottetto dell'indirizzo IP. Per eseguire questa operazione – ho cercato su Google come farlo e ho trovato sul sito ufficiale di SecureCRT (vandyke). La funzionalità si chiama prompt.

	crt.Screen.WaitForString("-Vlanif200]")
	hostnamestr = crt.Dialog.Prompt("Inserisci il nome host:", "hostname", "", False)
	ipaddressstr = crt.Dialog.Prompt("Inserisci l'indirizzo 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") 

Questa parte dello script richiedeva il nome host e i numeri dall'ultimo ottetto. Poiché avevo 15 pezzi di attrezzatura e i dati erano presentati in una tabella, copiavo i valori dalla tabella e li incollavo nelle finestre di dialogo. Poi lo script funzionava autonomamente.

Copia FTP su attrezzature di rete.

Questo script apriva per me una finestra di comando (shell) e copiava i dati tramite FTP. Al termine chiudeva la sessione. Utilizzare il blocco note per questo è impossibile, poiché la copia richiede molto tempo e i dati nel buffer FTP non rimarranno per così 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()

Immissione di nome utente/password tramite script

Un cliente aveva l'accesso diretto all'hardware di rete bloccato. Si poteva accedere all'hardware collegandosi prima al Gateway predefinito e poi a quello collegato. Per la connessione, veniva utilizzato il client ssh integrato in IOS/SO del dispositivo. Di conseguenza, nome utente e password venivano richiesti nella console. Con lo script qui sotto, nome utente e password venivano inseriti 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("snmpadminr")
	crt.Screen.WaitForString("assword:")
	crt.Screen.Send("Passwordr")
	crt.Screen.Synchronous = False
main()

Nota: Gli script erano 2. Uno per l'account amministratore, l'altro per l'account eSIGHT.

Script con la possibilità di aggiungere dati direttamente durante l'esecuzione dello script.

L'obiettivo era aggiungere un percorso statico a tutta l'attrezzatura di rete. Ma il gateway verso Internet era diverso su ogni dispositivo (e differiva dal gateway predefinito). Il seguente script generava la tabella di routing, entrava in modalità di configurazione senza completare il comando (l'indirizzo IP del gateway verso Internet) – questa parte la completavo io. Dopo aver premuto Invio, lo script continuava ad eseguire il 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()

In questo script, nella riga: crt.Screen.Send(«ip route 10.10.10.8 255.255.255.252 „) non è stato inserito l'indirizzo IP del gateway e manca il carattere di ritorno a capo. Lo script attendeva la comparsa della riga successiva con i caratteri «(config)#». Questi caratteri apparivano dopo che inserivo l'indirizzo IP e premevo Invio.

Conclusione:

Durante la scrittura e l'esecuzione dello script, deve essere sempre rispettata la regola: il tempo impiegato per scrivere lo script e per l'esecuzione non deve mai superare il tempo teoricamente necessario per completare manualmente lo stesso lavoro (copia/incolla dal notepad, scrittura e debug di un playbook per ansible, scrittura e debug di uno script python). Cioè, l'uso dello script deve far risparmiare tempo, e non far perdere tempo per un'automazione una tantum (cioè quando lo script è unico e non ci saranno ripetizioni). Ma se lo script è unico e l'automazione con lo script e la scrittura/debug dello script richiedono meno tempo rispetto all'esecuzione con qualsiasi altro metodo (ansible, finestra dei comandi), allora lo script è la soluzione migliore.
Debug dello script. Lo script cresce gradualmente, il debug avviene con test sui primi, secondi e terzi dispositivi e al quarto lo script sarà molto probabilmente completamente funzionante.

L'esecuzione dello script (con l'inserimento di username+password) tramite mouse avviene di solito più rapidamente rispetto alla copia dalle note, Username e Password. Tuttavia, non è sicuro dal punto di vista della sicurezza.
Un altro esempio (reale) di quando utilizzare uno script: Non hai accesso diretto all'hardware di rete. Ma c'è la necessità di configurare ulteriormente tutto l'hardware di rete (inserirlo nel sistema di monitoraggio, configurare ulteriormente Username/password/snmpv3username/password). Hai accesso quando accedi allo switch Core e da lì apri SSH su un altro dispositivo. Perché non è possibile utilizzare gli strumenti Ansible. — Perché ci troviamo di fronte a una limitazione sul numero di sessioni simultanee consentite sull'hardware di rete (line vty 0 4, user-interface vty 0 4) (un'altra domanda è come Ansible possa gestire diversi hardware con lo stesso SSH al primo hop).

Lo script riduce i tempi durante operazioni lunghe, ad esempio il trasferimento di file via FTP. Al termine del trasferimento, lo script inizia immediatamente a funzionare. La persona deve vedere la conclusione del trasferimento, poi rendersi conto della conclusione del trasferimento, quindi inserire i comandi appropriati. Lo script lo fa oggettivamente più rapidamente.

Gli script sono applicabili dove non è possibile utilizzare strumenti di distribuzione dati di massa: Console. O quando parte dei dati per l'hardware è unica: hostname, indirizzo IP di gestione. O quando scrivere un programma e debuggarlolo è più complesso che aggiungere i dati ottenuti dall'hardware durante l'esecuzione dello script. — Esempio di uno script per la configurazione di una rotta, quando su ogni dispositivo l'indirizzo IP del provider Internet è differente. (I miei colleghi hanno scritto tali script quando i DMVPN spoke superavano le trecento unità. Era necessario modificare le impostazioni DMVPN).

Esempio pratico: Impostazione delle configurazioni iniziali su un nuovo switch tramite porte console:

A. Ho collegato il cavo console al dispositivo.
B. Ho avviato lo script
C. Ho atteso il completamento dello script
D. Ho scollegato il cavo console e l'ho collegato al dispositivo successivo.
E. Se lo switch non è l'ultimo, tornare al punto B.

In sintesi, a seguito dell'esecuzione dello script:

  • è stata impostata una password iniziale sull'hardware.
  • è stato inserito Username
  • è stato inserito un indirizzo IP unico per il dispositivo.

P.S. l'operazione è stata ripetuta. Perché per Default l'ssh risultava non configurato/spento. (Sì, è stato un mio errore.)

Fonti utilizzate.

1. Sulla creazione di script
2. Esempi di script

Allegato 1: Esempi di script.


Esempio di uno script lungo, con due richieste: Nome host e indirizzo IP. Creato per la configurazione predefinita dell'attrezzatura tramite console (9600 baud). Inoltre, per preparare la connessione dell'attrezzatura alla rete.

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

Questi script di solito non sono necessari, ma la quantità di attrezzature – 15 pezzi – ha permesso di accelerare la configurazione. In seguito, configurare l'attrezzatura è stato più veloce usando la finestra di comando di SecureCRT.

Configurazione dell'account per ssh.

Un altro esempio. Configurazione anche tramite 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("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()


Su SecureCRT:Software a pagamento: a partire da 99$ (il prezzo più basso per SecureCRT per un anno)
Sito ufficiale
La licenza del software viene acquistata una sola volta, con supporto (per gli aggiornamenti), poi il software viene utilizzato con questa licenza per tempo illimitato.

Funziona sui sistemi operativi Mac OS X e Windows.

Supporta gli script (questo articolo)
C'è Finestra di comando
Seriale/Telnet/SSH1/SSH2/Shell del sistema operativo

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster