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

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

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

Съдържание

Въведение

В програмата SecureCRT от кутията е вграден механизъм за изпълнение на скриптове. За какво са скриптовете в терминала:

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

В този документ се разглеждат задачите:

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

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

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

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

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

Обикновено файл с разширение «*.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 => Script => Start Recording Script
б. Изпълнете действия с конзолата (изпълнете действия по настройка в CLI).
в. Спрете записа на скрипт:
Меню SecureCRT => Script => Stop Recording Script…
Запазете файла със скрипта.

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

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

Стартиране на скриптове в SecureCRT.

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

  • Ръчно стартиране от менюто Script
  • Автоматично стартиране след свързване (логон скрипт)
  • Автоматичен логон без използване на скрипт
  • Ръчно стартиране с помощта на бутон в SecureCRT (бутонът все още предстои да бъде създаден и добавен в SecureCRT)

Ръчно стартиране от менюто Script

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

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

Настройки за автоматично логване на скрипта се конфигурират за запазената сесия: Connection => Logon Actions => Logon script

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

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

Съществува възможност за автоматично въвеждане на име на потребител и парола без писане на скрипт, използвайки само вградената функционалност на SecureCRT. В настройките на връзката «Connection» => Logon Actions => Automate logon – трябва да попълните няколко двойки – които представляват „Очакван текст“ + „Изпратени символи за този текст“, такива двойки могат да бъдат много. (Пример: 1-ва двойка очакване за въвеждане на име на потребител, втора очакване за въвеждане на парола, трета очакване за покана в привилегирован режим, четвърта парола за привилегирован режим.)

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

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

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

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

а. Добавяме лента в интерфейса: Меню SecureCRT => View => Button Bar
б. Добавяме бутон на лентата и добавяме скрипт. – Щракнете с десния бутон на мишката върху лентата Button Bar и в контекстното меню изберете опцията «New button…».
в. В диалоговия прозорец «Map Button» в полето «Action» избираме действие (функция) «Run Script».
Посочете подписа за бутона. Цвят за иконата на бутона. Завършете настройките с натискане на Ok.

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

Забележка:

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

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

2. Има възможност да зададете предварително действие за стандартни операции с оборудването: показване на show version, show running-config, запазване на конфигурацията.

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

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

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

Автоматизация на въвеждането в SecureCRT с помощта на скриптове
При натискане на бутона Go Cisco – панелът се превключва на Cisco Button Bar.

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

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

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

Запитване на данни от потребителя с помощта на диалогов прозорец

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

	crt.Screen.WaitForString("-Vlanif200]")
	hostnamestr = crt.Dialog.Prompt("Въведете име на хост:", "hostname", "", False)
	ipaddressstr = crt.Dialog.Prompt("Въведете 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") 

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

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

Този скрипт стартираше командния прозорец (shell) и копираше данни по FTP. След завършване затваряше сесията. Използването на блокнота за това е невъзможно, тъй като копирането отнема много време и данните в 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()

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

При един клиент достъпът до мрежовото оборудване беше затворен. За да се свържете с оборудването, първо трябваше да се свържете с Шлюза по подразбиране, а след това да се свържете с него. За свързване се използваше 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 адреса и натискане на enter.

Заключение:

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

Стартирането на скрипта (с въвеждане на username и password) с помощта на мишка обикновено става по-бързо от копирането на Username и Password от бележника. Но не е безопасно от гледна точка на сигурността.
Друг (реален) пример за използване на скрипт: Нямате директен достъп до мрежовото оборудване. Но имате нужда да конфигурирате всичкото мрежово оборудване (да го внесете в системата за мониторинг, да настроите допълнителни Username/password/snmpv3username/password). Имате достъп, когато влезете в Core комутатора и от него отваряте SSH на друго оборудване. Защо не може да се използват средства на Ansible. — Защото се сблъскваме с ограничение на броя на допустимите едновременни сесии на мрежовото оборудване (line vty 0 4, user-interface vty 0 4) (друг въпрос е как в Ansible да добавяте различно оборудване с един и същ SSH на първия хоп).

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

Скриптовете са приложими там, където не може да се използват средства за масово разпространение на данни: Конзолата. Или когато част от данните за оборудването е уникална: hostname, management ip address. Или когато написването на програма и отстраняването на грешки е по-сложно, отколкото да добавите данни, получени от оборудването по време на работа на скрипта. — Пример с скрипт за задаване на маршрути, когато всеки IP адрес на интернет доставчика за оборудването е свой. (Моите колеги са писали такива скриптове – когато DMVPN spoke беше над 300. Необходимо беше да се променят настройките на DMVPN).

Пример от практиката: Задаване на първоначални настройки на нов комутатор през конзолните портове:

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

В крайна сметка от работата на скрипта:

  • на оборудването беше зададен начален парола.
  • въведен Username.
  • въведен уникален IP адрес на устройството.

P. S. операцията трябваше да се повтори. Тъй като по подразбиране 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 Command window.

Настройка на акаунт за 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.

Има поддръжка за скриптове (тази статия)
Има Command Window
Серийни / Telnet / SSH1 / SSH2 / Shell на операционната система

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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster