Скрипт для сетевых устройств — существует много программных платформ для работы с сетевыми устройствами, такими как коммутаторы и маршрутизаторы, однако иногда требуется что-то более гибкое и в то же время простое. Скрипт должен выполнить однотипную операцию на группе сетевых устройств, но с разными параметрами для каждого устройства.
Выбор ПО
Задача условно распадается на 2 подзадачи:
- Выбор языка программирования для скрипта;
- Выбор среды выполнения для скрипта.
Опять же много вариантов, но идеально подходит Posh-SSH — модуль поддержки протоколов SSH, SFTP, SCP для PowerShell (далее PS). Домашняя страничка проекта.
Там много и подробно рассказано об использовании.
Требования: PowerShell 3.0 и .NET 4.0.
Средой выполнения становится удобный и распространённый PS, он же язык программирования скрипта.
Поскольку потребуется ещё подгружать данные для работы скрипта, то нужен модуль для PS PSExel.
Требования PowerShell 5.
Подготовка компьютера
Модуль PSExel отказывается устанавливаться на старые версии PS, поэтому сначала необходимо скачать обновление с MS.
Проверим версию PS с помощью команды:
$host.version

Теперь нужно разрешить выполнение неподписанных скриптов в PS, которое по умолчанию запрещено:
Set-ExecutionPolicy Unrestricted
PS при этом необходимо запускать от Администратора.
Установка
Posh устанавливается 1 командой:
iex (New-Object Net.WebClient).DownloadString("https://gist.github.com/darkoperator/6152630/raw/c67de4f7cd780ba367cccbc2593f38d18ce6df89/instposhsshdev") Get-Command *ssh*
После успешного выполнения будет выведен список новых командлетов:

Теперь устанавливаем PSExel, для установки нужно запустить PS от Администратора:
Install-Module PSExcel
Установка может занимать несколько минут и возможно предложит установить NuGet:

Скрипт
Простой скрипт
Для разогрева рассмотрим простой скрипт для 1 устройства, нужен будет только Posh-SSH. Самая наверное востребованная задача это перезагрузка по расписанию. Конечно же проще всего воспользоваться опциями at/in команды reload на самом устройстве:
Switch# reload ? LINE Reason for reload at Reload at a specific time/date cancel Cancel pending reload in Reload after a time interval
Но мы не ищем лёгких путей и отработаем скрипт на пошике:
Function Restart ( ) { Get-SSHSession | Remove-SSHSession $PWord = ConvertTo-SecureString –String "пароль" –AsPlainText -Force $Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList "логин", $PWord $SSHSession=New-SSHSession -ComputerName "IP адрес" -Credential $Credential -AcceptKey $SSH = $SSHSession | New-SSHShellStream Start-Sleep -Seconds 1 $cmd1="reload" $SSH.WriteLine( $cmd1) Start-Sleep -Seconds 1 $cmd2="" $SSH.WriteLine( $cmd2) Get-SSHSession | Remove-SSHSession } Restart
Далее ставим выполнение скрипта в Планировщик.
Если нет SSH
Столкнулся с такой ситуацией: коммутаторы CISCO прошиты и нужно их ребутнуть, но сделать это можно только через Telnet и только в короткий промежуток времени ночью, удалённого доступа из дома нет. Опять же: как сделать без опций команды reload? Поможет Telnet Scripting Tool, взять можно здесь.
Программа нормально работает и с новыми версиями Windows, включая 10 и 2012 R2. Нужно только обязательно выключить Контроль учётных записей, иначе скрипт повиснет в Планировщике не начав выполняться. Строка запуска:
tst10.exe /r:script.txt /o:out.txt
Содержимое script.txt для перезапуска будет следующим:
192.168.10.3 WAIT “Username:” SEND “логин\m” WAIT “Password:” SEND “пароль\m” WAIT “#” SEND “reload\m” WAIT “Proceed with reload? [confirm]” SEND “\m”
Скрипт посложнее
Итак, скрипт использует цикл: в теле цикла в каждой итерации построчно выбираются данные из файла Exel, а затем вызывается функция, выполняющая необходимые команды на устройстве, до тех пора, все строки из файла не будут выбраны.
Подготовка файла Exel
Для примера использования Posh возьмем добавление пользователей на 5 коммутаторов CISCO. Каждый коммутатор может иметь отличные от других коммутаторов реквизиты доступа администратора (логин, пароль) и реквизиты доступа для нового пользователя также могут отличаться.
Сначала потребуется подготовить файл Exel с параметрами. Пример такого файла (SSH.xlsx):
IP_Net | Adm | PassAdm | NewUser | PassUser |
192.168.1.1 | admin1 | pass1 | user1 | pass_user1 |
192.168.2.1 | admin2 | pass2 | user2 | pass_user2 |
192.168.3.1 | admin3 | pass3 | user3 | pass_user3 |
192.168.4.1 | admin4 | pass4 | user4 | pass_user4 |
192.168.5.1 | admin5 | pass5 | user5 | pass_user5 |
Подготовка функции скрипта
Функция включает в себя переменные из файла Exel и работает следующим образом:
- Удаляется существующая SSH сессия, если она есть;
- Происходит подключение к текущему устройству;
- Вход в режим глобальной конфигурации;
- Выполнение команды по созданию пользователя;
- Выход из режима глобальной конфигурации;
- Сохранение текущей конфигурации в стартовую;
- Удаление сессии SSH.
Поскольку выполнение команды занимает некоторое время, то по месту вводятся паузы в 1 секунду:
Start-Sleep -Seconds 1
Запись конфигурации занимает больше времени, тут нужна дополнительная пауза в 3 секунды.
Function CreateUser ( $IP_Net, $Adm, $PassAdm, $NewUser, $PassNewUser) { Get-SSHSession | Remove-SSHSession $PWord = ConvertTo-SecureString –String $PassAdm –AsPlainText -Force $Credential = New-Object –TypeName System.Management.Automation.PSCredential –ArgumentList $Adm, $PWord $SSHSession=New-SSHSession -ComputerName $IP_Net -Credential $Credential -AcceptKey $SSH = $SSHSession | New-SSHShellStream Start-Sleep -Seconds 1 $cmd1="config t" $SSH.WriteLine( $cmd1) $SSH.read() Start-Sleep -Seconds 1 $cmd2="username "+$NewUser+" privilege 3 secret "+$PassNewUser $SSH.WriteLine( $cmd2) $SSH.read() Start-Sleep -Seconds 1 $cmd3="exit" $SSH.WriteLine( $cmd3) Start-Sleep -Seconds 1 $SSH.read() $cmd4="wr" $SSH.WriteLine( $cmd4) Start-Sleep -Seconds 3 $SSH.read() Get-SSHSession | Remove-SSHSession }
Подготовка цикла
Цикл работоспособен, если в файле Exel 2 и более строки.
$f1="D:\SSH.xlsx" Test-Path $f1 $n=Import-XLSX $f1 -Sheet "Sh1" $l=$n.Length for ($i=0; $i -lt $l; $i++) { $k1=$n[$i].IP_Net $k2=$n[$i].Adm $k3=$n[$i].PassAdm $k4=$n[$i].NewUser $k5=$n[$i].PassNewUser CreateUser $k1 $k2 $k3 $k4 $k5 }
Проверка скрипта
Помещаем функцию и цикл (функция должна быть объявлена до цикла) в файл SSH.ps1. Выполнять и отлаживать работу скрипта лучше в среде PS ISE. Файл Exel на момент выполнения скрипта должен быть закрыт, иначе будет ошибка доступа к файлу.
Вывод скрипта следующий:
PS C:\WINDOWS\system32> D:\SSH.ps1 True - закрытие сессии Router1# config t Enter configuration commands, one per line. End with CNTL/Z. Router1(config)# username user1 privilege 3 secret pass_user1 Router1(config)# exit Router1# wr Building configuration... [OK] 3550-1# True - закрытие сессии ...
Проверим конфигурацию Router1:
R1# sh run | include username username admin1 ... username user1 privilege 3 secret 5 $1$YYvv$ftLXxEbE0fQlpsQuqSqrE0
Пробуем подключиться под новым пользователем:
login as: user1 Using keyboard-interactive authentication. Password: XXXXXXXXXX R1# - подключение успешно
Заключение
Таким способом можно выполнять любые команды, а не только создавать пользователя, сразу на группе сетевых устройств. Недостатком является то, что нужно каждый раз подготавливать новый файл Exel вручную и это будет рутинной работой. Достоинством является ускорение процесса выполнения команд по сравнению с ручными манипуляциями. Гибкостью является возможность задавать различные параметры для разных устройств.
В общем и целом есть свои плюсы, есть свои минусы, но данный метод вполне жизнеспособен.