Скрипт для сетевых устройств — существует много программных платформ для работы с сетевыми устройствами, такими как коммутаторы и маршрутизаторы, однако иногда требуется что-то более гибкое и в то же время простое. Скрипт должен выполнить однотипную операцию на группе сетевых устройств, но с разными параметрами для каждого устройства.
Выбор ПО
Задача условно распадается на 2 подзадачи:
- Выбор языка программирования для скрипта;
- Выбор среды выполнения для скрипта.
Опять же много вариантов, но идеально подходит Posh-SSH - модуль поддержки протоколов SSH, SFTP, SCP для PowerShell (далее PS). Домашняя страничка проекта: //www.powershellmagazine.com/2014/07/03/posh-ssh-open-source-ssh-powershell-module/
Там много и подробно рассказано об использовании.
Требования - 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, взять можно здесь: //support.moonpoint.com/downloads/windows/network/Telnet/tst10.php
Программа нормально работает и с новыми версиями 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 | PassNewUser |
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 вручную и это будет рутинной работой. Достоинством является ускорение процесса выполнения команд по сравнению с ручными манипуляциями. Гибкостью является возможность задавать различные параметры для разных устройств.
В общем и целом - есть свои плюсы, есть свои минусы, но данный метод вполне жизнеспособен.