Крізь порти на обладнанні до машин користувача

Доброго часу, Храбителі.

Цей пост розповідає Вам про те, як за допомогою PowerShell ми знову змогли трохи полегшити нам життя та автоматизувати пошук обладнання та портів, на яких сидять комп'ютери користувачів. Це необхідно в той момент, коли треба прокинути vlan`и (ну чи просто для інформації).

обладнанні
"

Передісторія

Все почалося близько року тому. Якось наш старший адміністратор запропонував мені спробувати написати скрипт на цю тему. Почухавши гарбуз, я погодився спробувати. До цього я ніколи не працював з мережевим обладнанням (ну домашній роутер не береться до уваги), тому він мені скинув зразкову послідовність команд, за допомогою яких все це можна було робити.

Використовуючи Putty, я спробував зробити все це вручну, все вийшло та я почав думати як все це автоматизувати. Та не просто автоматизувати, а зробити це за допомогою PowerShell. Чому саме PoSh? У той час я на нього сильно запал (хоча я і зараз з нього не злазю), можна було зробити це в іншому, але мені дуже сильно хотілося зробити це через PoSh.

Так як підключатися до обладнання потрібно через Telnet і SSH (в основному через Telnet, тому що на той момент SSH був не скрізь, але про це пізніше) я провів чимало часу в інтернеті, щоб дізнатися як PowerShell може працювати з цими протоколами. Тоді я звернувся до 2 механізмів підключення:

  1. використання plink.exe (з Putty)
  2. Netcmdlets фірми /n software
Використовувавши переважно plink.exe у мене вийшло щось, що важко було назвати витвором мистецтва. Це був величезний, нагромаджений скрипт, який нікому не хотілося показувати. А тим більше писати про це статтю тут. І оскільки воно працювало(періодично, я ним навіть користувався), я відклав його оптимізацію у довгу скриньку та зайнявся іншими справами.

Минув час, за цей час багато що змінилося, але про те своє дітище я не забував, періодично роблячи спроби переписати його заново, і позбутися купи непотрібних речей. Зрештою мені це вдалося!

Vader, rise!

Найважливішим з того, що сталося, було те, що оновили прошивки у комутаторів, і тепер стало можливо підключатися до них по SSH. Що ж, добре, значить забиваємо на telnet. За цим була ще одна зміна: якщо telnet більше не потрібен, ми можемо не використовувати plink.exe (з Putty) і вся слава дістається NetCmdlets. Поспілкувавшись чимало з техпідтримкою цієї фірми, нарешті я розібрався у влаштуванні цих знарядь праці, і почав роботу.

NetCmdlets

Так як я хочу сказати спасибі людям, які їх зробили, невеликий відступ і кілька слів про цих командлетів: Почитати про них і завантажити їх можна тут. Завантажити можна як тріальну версію (на 30 днів) і повну (за 100$ однією комп'ютер). Я скористався тріальної версією, т.к. після закінчення терміну її можна легко перевстановити. Нещодавно на ресурсі powershellmagazine.com лунали ці командлети безкоштовно, я встиг схопити. Так що будьте на чеку! Але повернемося до наших баранів. Вибравши набір цих cmdletів, я приступив до їх вивчення. Цей набір досить великий, так що я не описуватиму все, що там є. зупинюся на 2:

  • Сonnect-SSh
  • Invoke-SSh
Можна обійтися тільки Invoke-SSh, але тоді у вас не буде постійної сесії з пристроєм (тобто, скажімо, виконати команди в conf t на пристрої вже буде не можна). Тому командлетом Сonnect-SSh ми створюємо підключення до пристрою, а командлетом Invoke-SSh виконуємо команди. Уседосить просто. Важливим моментом є те, що ці командлети можуть працювати разом із командлетом Get-Credential, в яку Ви можете записати облікові дані на підключення до обладнання (приклади побачите у скрипті), тобто. облікові дані не зберігаються у відкритому вигляді у скрипті (як це я мав з використанням plink.exe). Я не параноїк, але любити перестрахуватися.

Парсинг виведення та регулярні вирази

Мене очікував дуже романтичний парсинг виведення оболонки Cisco iOS, тому командлет Invoke-SSH показує висновок у стовпці Text, тобто. передавши змінну висновок, ми отримуємо великий текст. Тут нам приходять на допомогу регулярні висловлювання. Але хто паршив великі тексти, знає, що дістати потрібний фрагмент звідти досить непросто, але завдяки PowerShell ми з блиском вийшли з цієї ситуації. В даний момент читай PowerShell in Action 2-nd Edition. Тому, хто вивчає PoSh, я рекомендую цю книгу. І в ній я прочитав про таку річ, як named regexp. Суть у тому, що PowerShell містить змінну $Mathces, в яку заносяться всі збіги при використанні регулярних виразів:

Але це ще не все! Уся плюшка в тому, що якщо ми додамо таким чином ми можемо звертатися безпосередньо до результатів збігів і обійти парсинг такою чудовою річчю (ф топку split!). Не знаю як для вас, а для мене це було відкриття (наприклад, на українських ресурсах з PowerShell про це нічого немає), при якому я був готовий верещати як школярка. Цікаво, чи в інших мовах таке є?

Сам скрипт

Власне, сам скрипт.

Хардкорна конфа за С++. Ми запрошуємо лише профі.