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

Передісторія
Все почалося близько року тому. Якось наш старший адміністратор запропонував мені спробувати написати скрипт на цю тему. Почухавши гарбуз, я погодився спробувати. До цього я ніколи не працював з мережевим обладнанням (ну домашній роутер не береться до уваги), тому він мені скинув зразкову послідовність команд, за допомогою яких все це можна було робити.
Використовуючи Putty, я спробував зробити все це вручну, все вийшло та я почав думати як все це автоматизувати. Та не просто автоматизувати, а зробити це за допомогою PowerShell. Чому саме PoSh? У той час я на нього сильно запал (хоча я і зараз з нього не злазю), можна було зробити це в іншому, але мені дуже сильно хотілося зробити це через PoSh.
Так як підключатися до обладнання потрібно через Telnet і SSH (в основному через Telnet, тому що на той момент SSH був не скрізь, але про це пізніше) я провів чимало часу в інтернеті, щоб дізнатися як PowerShell може працювати з цими протоколами. Тоді я звернувся до 2 механізмів підключення:
- використання plink.exe (з Putty)
- Netcmdlets фірми /n software
Минув час, за цей час багато що змінилося, але про те своє дітище я не забував, періодично роблячи спроби переписати його заново, і позбутися купи непотрібних речей. Зрештою мені це вдалося!
Vader, rise!
Найважливішим з того, що сталося, було те, що оновили прошивки у комутаторів, і тепер стало можливо підключатися до них по SSH. Що ж, добре, значить забиваємо на telnet. За цим була ще одна зміна: якщо telnet більше не потрібен, ми можемо не використовувати plink.exe (з Putty) і вся слава дістається NetCmdlets. Поспілкувавшись чимало з техпідтримкою цієї фірми, нарешті я розібрався у влаштуванні цих знарядь праці, і почав роботу.
NetCmdlets
Так як я хочу сказати спасибі людям, які їх зробили, невеликий відступ і кілька слів про цих командлетів: Почитати про них і завантажити їх можна тут. Завантажити можна як тріальну версію (на 30 днів) і повну (за 100$ однією комп'ютер). Я скористався тріальної версією, т.к. після закінчення терміну її можна легко перевстановити. Нещодавно на ресурсі powershellmagazine.com лунали ці командлети безкоштовно, я встиг схопити. Так що будьте на чеку! Але повернемося до наших баранів. Вибравши набір цих cmdletів, я приступив до їх вивчення. Цей набір досить великий, так що я не описуватиму все, що там є. зупинюся на 2:
- Сonnect-SSh
- Invoke-SSh
Парсинг виведення та регулярні вирази
Мене очікував дуже романтичний парсинг виведення оболонки Cisco iOS, тому командлет Invoke-SSH показує висновок у стовпці Text, тобто. передавши змінну висновок, ми отримуємо великий текст. Тут нам приходять на допомогу регулярні висловлювання. Але хто паршив великі тексти, знає, що дістати потрібний фрагмент звідти досить непросто, але завдяки PowerShell ми з блиском вийшли з цієї ситуації. В даний момент читай PowerShell in Action 2-nd Edition. Тому, хто вивчає PoSh, я рекомендую цю книгу. І в ній я прочитав про таку річ, як named regexp. Суть у тому, що PowerShell містить змінну $Mathces, в яку заносяться всі збіги при використанні регулярних виразів:
Але це ще не все! Уся плюшка в тому, що якщо ми додамо таким чином ми можемо звертатися безпосередньо до результатів збігів і обійти парсинг такою чудовою річчю (ф топку split!). Не знаю як для вас, а для мене це було відкриття (наприклад, на українських ресурсах з PowerShell про це нічого немає), при якому я був готовий верещати як школярка. Цікаво, чи в інших мовах таке є?
Сам скрипт
Власне, сам скрипт.
Хардкорна конфа за С++. Ми запрошуємо лише профі.