Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Мрежовите инженери често се сблъскват със задачата да копират/поставят определени фрагменти от бележник в конзолата. Обикновено трябва да копирате няколко параметъра: потребителско име/парола и още нещо. Използването на скриптове ви позволява да ускорите този процес. НО задачите по писане на скрипта и изпълнение на скрипта трябва да отнемат общо по-малко време от ръчната конфигурация, в противен случай скриптовете са безполезни.

За какво е тази статия? Тази статия е от поредицата Fast Start и има за цел да спести време на мрежовите инженери при настройване на оборудване (една задача) на множество устройства. Използва софтуер SecureCRT и вградена функционалност за изпълнение на скриптове.

Съдържание

въведение

Програмата SecureCRT има вграден механизъм за изпълнение на скриптове. За какво са терминалните скриптове?

  • Автоматизиран I/O и минимално I/O валидиране.
  • Ускоряване на изпълнението на рутинни задачи - намаляване на паузите между настройките на оборудването. (Дефакто намаляване на паузите, причинени от времето за извършване на копиране/минали действия на същия хардуер, с 3 или повече командни фрагмента, които да бъдат приложени към хардуера.)

Този документ обхваща задачите:

  • Създаване на прости скриптове.
  • Изпълнение на скриптове на SecureCRT.
  • Примери за използване на прости и разширени скриптове. (Практика от реалния живот.)

Създаване на прости скриптове.

Най-простите скриптове използват само две команди, Send и WaitForString. Тази функционалност е достатъчна за 90% (или повече) от изпълняваните задачи.

Скриптовете могат да работят в Python, JS, VBS (Visual Basic), Perl и др.

Питон

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

Обикновено файл с разширение "*.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

Обикновено файл с разширение "*.vbs"

Създайте скрипт, като използвате запис в скрипт.

Позволява ви да автоматизирате процеса на писане на скрипт. Започвате да пишете сценарий. SecureCRT записва командите и последващия хардуерен отговор и показва готовия скрипт за вас.

А. Започнете да пишете скрипт:
SecureCRT Menu => Script => Start Recording Script
b. Извършване на действия с конзолата (извършване на стъпки за конфигуриране в CLI).
V. Завършете писането на скрипта:
Меню SecureCRT => Скрипт => Спиране на запис на скрипт...
Запазете файла със скрипта.

Пример за изпълнени команди и записан скрипт:

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Изпълнение на скриптове на SecureCRT.

След създаване/редактиране на скрипта възниква естествен въпрос: Как да приложа скрипта?
Има няколко начина:

  • Изпълнява се ръчно от менюто Скрипт
  • Автоматично стартиране след свързване (скрипт за влизане)
  • Автоматично влизане без използване на скрипт
  • Задействане ръчно с бутон в SecureCRT (бутон все още не е създаден и добавен към SecureCRT)

Изпълнява се ръчно от менюто Скрипт

Меню SecureCRT => Скрипт => Изпълнение…
- Последните 10 скрипта се запомнят и са достъпни за бързо стартиране:
Меню SecureCRT => Скрипт => 1 "Име на файл на скрипт"
Меню SecureCRT => Скрипт => 2 "Име на файл на скрипт"
Меню SecureCRT => Скрипт => 3 "Име на файл на скрипт"
Меню SecureCRT => Скрипт => 4 "Име на файл на скрипт"
Меню SecureCRT => Скрипт => 5 "Име на файл на скрипт"

Автоматично стартиране след свързване (скрипт за влизане)

Настройките на скрипта за автоматично регистриране са конфигурирани за запазената сесия: Връзка => Действия при влизане => Скрипт за влизане

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Автоматично влизане без използване на скрипт

Възможно е автоматично въвеждане на потребителското име на паролата без писане на скрипт, като се използва само вградената функционалност на SecureCRT. В настройките на връзката „Връзка“ => Действия при влизане => Автоматично влизане - трябва да попълните няколко пакета - което означава двойките: „Очакван текст“ + „Изпратени знаци към този текст“ може да има много такива двойки. (Пример: 1-ва двойка чака потребителско име, втора чака парола, трета чака подкана за привилегирован режим, четвърта двойка за парола за привилегирован режим.)

Пример за автоматично влизане в Cisco ASA:

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Задействане ръчно с бутон в SecureCRT (бутон все още не е създаден и добавен към SecureCRT)

В SecureCRT можете да зададете скрипт на бутон. Бутонът се добавя към панел, специално създаден за тази цел.

А. Добавяне на панел към интерфейса: SecureCRT Menu => View => Button Bar
b. Добавете бутон към панела и добавете скрипт. – Щракнете с десния бутон върху лентата с бутони и изберете „Нов бутон…“ от контекстното меню.
V. В диалоговия прозорец „Бутон за карта“, в полето „Действие“ изберете действието (функция) „Изпълни скрипт“.
Посочете надпис за бутона. Цветът за иконата на бутона. Завършете настройките, като щракнете върху Ok.

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Забележка:

Панелът с бутони е много полезна функционалност.

1. Възможно е, когато влизате в конкретна сесия, да посочите кой панел да се отвори към този раздел по подразбиране.

2. Възможно е да зададете предварително дефинирани действия за стандартни действия с оборудване: показване на показване на версията, показване на текуща конфигурация, запазване на конфигурацията.

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове
Към тези бутони не е прикачен скрипт. Само линия на действие:

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове
Настройка - така че при превключване към сесия в настройките на сесията да се отвори необходимият панел с бутони:

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове
Има смисъл клиентът да настрои индивидуални скриптове за влизане и да отиде до панела с чести команди за доставчика.

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове
Когато натиснете бутона Go Cisco, панелът превключва към лентата с бутони Cisco.

Автоматизиране на въвеждане в SecureCRT с помощта на скриптове

Примери за използване на прости и разширени скриптове. (Практика от реалния живот.)

Простите скриптове са достатъчни за почти всички случаи. Но веднъж трябваше да усложня малко сценария - да ускоря работата. Това усложнение просто поиска допълнителни данни в диалогов прозорец от потребителя.

Изискване на данни от потребителя чрез диалогов прозорец

В скрипта за заявка на данни имах 2. Това е името на хоста и 4-тия октет на IP адреса. За да изпълня това действие - потърсих в Google как да го направя и го намерих на официалния сайт на SecureCRT (vandyke). - функционалността се нарича подкана.

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

Тази част от скрипта поиска име на хост и числа от последния октет. Тъй като имаше 15 броя оборудване. И данните бяха представени в таблица, след което копирах стойностите от таблицата и ги поставих в диалоговите прозорци. По-нататък скриптът работи независимо.

FTP копиране към мрежово оборудване.

Този скрипт стартира моя команден прозорец (shell) и копира данни през FTP. В края затворете сесията. Невъзможно е да използвате notepad за това, защото копирането отнема много време и данните във FTP буфера няма да се съхраняват толкова дълго:

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

Въвеждане на потребителско име/парола с помощта на скрипт

При един клиент достъпът директно до мрежовото оборудване беше затворен. Възможно е да се влезе в оборудването, като първо се свърже с Default Gateway, а от него след това към свързаното към него оборудване. Ssh клиентът, вграден в IOS/хардуерния софтуер, беше използван за свързване. Съответно потребителското име и паролата бяха поискани в конзолата. Със скрипта по-долу потребителското име и паролата бяха въведени автоматично:

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

Забележка: Имаше 2 скрипта. Единият за администраторския акаунт, вторият за акаунта на eSIGHT.

Скрипт с възможност за директно добавяне на данни по време на изпълнение на скрипта.

Задачата беше да се добави статичен маршрут на цялото мрежово оборудване. Но шлюзът към интернет на всяко оборудване беше различен (и се различаваше от шлюза по подразбиране). Следният скрипт показа таблицата за маршрутизиране, влезе в режим на конфигурация, не написа командата до края (IP адреса на шлюза към Интернет) - добавих тази част. След като натиснах Enter, скриптът продължи да изпълнява командата.

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

В този скрипт, в реда: crt.Screen.Send("ip route 10.10.10.8 255.255.255.252") не се добавя IP адресът на шлюза и няма символ за връщане на каретката. Скриптът чака следващия ред със знаците "(config) #" Тези знаци се появиха, след като въведох ip адреса и въведете.

заключение:

Когато пишете скрипт и го изпълнявате, трябва да се спазва правилото: Времето за писане на скрипт и изпълнение на скрипт никога не трябва да бъде повече от времето, теоретично изразходвано за извършване на същата работа ръчно (копиране / поставяне от бележник, писане и отстраняване на грешки наръчник за ansible, писане и отстраняване на грешки в python скрипт). Това означава, че използването на скрипта трябва да спести време, а не да губи време за еднократна автоматизация на процесите (т.е. когато скриптът е уникален и няма да има повече повторения). Но ако скриптът е уникален и автоматизацията със скрипта и писането/отстраняването на грешки в скрипта отнема по-малко време, отколкото да го направите по друг начин (анзибъл, команден прозорец), тогава скриптът е най-доброто решение.
Отстраняване на грешки в скрипт. Скриптът расте постепенно, отстраняването на грешки се извършва при стартиране на първо, второ, трето устройство и до четвъртото скриптът най-вероятно ще бъде напълно работещ.

Стартирането на скрипт (чрез въвеждане на потребителско име+парола) с мишката обикновено е по-бързо от копирането на потребителско име и парола от бележник. Но не е безопасно от гледна точка на сигурността.
Друг (реален) пример при използване на скрипт: Нямате директен достъп до мрежово оборудване. Но има нужда от конфигуриране на цялото мрежово оборудване (вкарайте го в системата за наблюдение, конфигурирайте допълнително потребителско име/парола/snmpv3username/парола). Има достъп, когато отидете на Core switch, от него отваряте SSH към друго оборудване. Защо не можете да използвате Ansible. - Тъй като се сблъскваме с ограничение за броя на разрешените едновременни сесии на мрежово оборудване (линия vty 0 4, потребителски интерфейс vty 0 4) (друг въпрос е как да стартираме различно оборудване в Ansible с един и същ SSH първи скок).

Скриптът намалява времето при дълги операции - например копиране на файлове през FTP. След като копирането приключи, скриптът веднага започва да работи. Човек ще трябва да види края на копирането, след това да осъзнае края на копирането и след това да въведе съответните команди. Скриптът го прави обективно по-бързо.

Скриптовете са приложими, когато е невъзможно да се използват инструменти за масова доставка на данни: Конзола. Или когато някои от данните за оборудването са уникални: име на хост, IP адрес за управление. Или когато пишете програма и отстраняването на грешки е по-трудно от добавянето на данни, получени от оборудването, докато скриптът работи. - Пример със скрипт за предписване на маршрут, когато всяко оборудване има собствен IP адрес на интернет доставчика. (Моите колеги са писали такива скриптове - когато DMVPN говори, беше над 3. Трябваше да се променят настройките на DMVPN).

Казус от практиката: Конфигуриране на първоначални настройки на нов превключвател с помощта на портовете на конзолата:

A. Включете кабела на конзолата в устройството.
Б. Стартирайте скрипта
B. Изчаках изпълнението на скрипта
Г. Включете кабела на конзолата в следващото устройство.
E. Ако превключвателят не е последният, преминете към стъпка B.

В резултат на работата на скрипта:

  • първоначалната парола е зададена на оборудването.
  • Потребителското име е въведено
  • въвежда се уникалният IP адрес на устройството.

PS операцията трябваше да се повтори. Тъй като ssh по подразбиране не е конфигуриран/деактивиран. (Да, това е моя грешка.)

Използвани източници.

1. Относно създаването на скриптове
2. Примери за скриптове

Приложение 1: Примерни скриптове.


Пример за дълъг скрипт с две заявки: име на хост и IP адрес. Създаден е за предварителна настройка на оборудване през конзолата (9600 бода). А също и да подготви свързването на оборудването към мрежата.

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

Такива скриптове обикновено не са необходими, но количеството оборудване е 15 бр. Позволена по-бърза настройка. Беше по-бързо да настроите оборудването с помощта на командния прозорец SecureCRT.

Настройване на акаунт за ssh.

Друг пример. Конфигурирането става и през конзолата.

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


Относно SecureCRT:Платен софтуер: от $99 (най-ниската цена е само за SecureCRT за една година)
Официален сайт
Софтуерен лиценз се закупува веднъж, с поддръжка (за актуализиране), след което софтуерът се използва с този лиценз за неограничено време.

Работи на операционни системи Mac OS X и Windows.

Има поддръжка на скриптове (тази статия)
Има Команден прозорец
Операционна система Serial/Telnet/SSH1/SSH2/Shell

Източник: www.habr.com