В виду того, что на нынешнем месте работы ресурсов для теста и введения боевого сервера попросту нет, а те что использовались под VM с осью Ubuntu 18.04.5 Server где крутится скрипт по выполнению резервного копирования конфигурацию маршрутизаторов Mikrotik через bash нужны другому проекту. А значит настает пора, да и есть свободное время дабы перенести скрипт на PowerShell и выполнять его с любой Windows системы.
Т.к. у меня дома несколько Mikrotik’ов то скрипт успешно было оттестирован на моих:
Ekzhome: Mikrotik RB2011UiAS-2HnD (mipsbe) v6.47Ekzhome1: Mikrotik hAP ac^2 (arm) v6.47Ekzhome2: Mikrotik CRS326-24G-2S+ (arm) v6.47.3
На всех моих Mikrotik используется одна учетная запись
На заметку: Скрипт запускаю в консоли PowerShell которая запущена через "Run as administrator"
Шаг №1: На системе Windows Server 2012 R2 Std устанавливаю редактор notepad++ и создаю в корне диска C: каталога script где размещаю скрипт на PowerShell:
Шаг №2: Скрипт для единичного бекапирования Mikrotik: bmikrotikone
Set-Executionpolicy unrestricted
#Check if out module loaded
if (Get-Module -ListAvailable -Name Posh-SSH) { <# do nothing #> }
else {
Install-Module Posh-SSH
}
#Каталог расположения бекапов
$Letter_Drive = "C:"
$BackupFolder = "backup"
$BackupPath = $Letter_Drive + "\" + $BackupFolder
#Функция для создания структуры каталогов
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {
New-Item $Path -Type directory
}
}
#Создаем каталог для бекапов
CheckPath $BackupPath | Out-Null
#Передайте нежелательные результаты команд / вызовов функций
#в вызываемой функции через "... | Out-Null",
#а затем просто верните нужную вещь.
write-host $BackupPath
#Импортирую установленный модуль
Import-Module Posh-SSH
$username = "username"
$password = "password"
$hostname = "ipaddress"
$Port = "22"
$fnamebackup = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
$fnamersc = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
$secpassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($username, $secpassword)
$ssh = New-SSHSession $hostname -AcceptKey:$true -Credential $Cred -ErrorAction Stop -Port 22
$outbackup = (Invoke-SSHCommand $ssh -Command "/system backup save name=$fnamebackup dont-encrypt=yes" -EnsureConnection).Output
$outrsc = (Invoke-SSHCommand $ssh -Command "export file=$fnamersc" -EnsureConnection).Output
#set name mikrotik
$mikrotikname = (Invoke-SSHCommand $ssh -Command "/system identity print" -EnsureConnection).Output
#Форматируем значение переменной $mikrotikname
$fa = $mikrotikname | out-file $BackupPath\name.txt
$fb = Get-Content $BackupPath\name.txt -first 1
$fc = $fb.Split(": ")[-1]
$fc
#Создаем внутри каталога C:\backup каталог с именем Mikrotik,
#ключ Force обязателен, т.к. каталог уже есть и каждый последующий день будет тут же
$MName = new-item -Path $BackupPath\$fc -Type Directory -Force
$MName
#Делаем бекапы backup и бекап конфигурации rsc и через ftp забираем их на каталог c:\backup\<mikrotik_name>
#А после удаляем с Mikrotik
if($outbackup.Trim() -eq "Configuration backup saved")
{
$sftp = New-SFTPSession $hostname -AcceptKey -Credential $Cred
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamebackup.backup" -LocalPath "$MName\" -Overwrite
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamersc.rsc" -LocalPath "$MName\" -Overwrite
Start-Sleep 2
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamebackup.backup" -Force
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamersc.rsc" -Force
Remove-SFTPSession $sftp
}
Remove-SSHSession $ssh
Шаг №3: Скрипт для массового бекапирования Mikrotik‘ов: bmikrotikmore
Set-Executionpolicy unrestricted
#Check if out module loaded
if (Get-Module -ListAvailable -Name Posh-SSH) { <# do nothing #> }
else {
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force -Confirm
Install-Module Posh-SSH
}
#Текущая дата
$CurrentDate = get-date -format dd.MM.yyyy
#Каталог расположения бекапов
$Letter_Drive = "C:"
$BackupFolder = "backup"
$BackupPath = $Letter_Drive + "\" + $BackupFolder
#Функция для создания структуры каталогов
Function CheckPath ($Path) {
$Path_Exists = Test-Path -Path $Path
If ($Path_Exists -eq $False) {
New-Item $Path -Type directory
}
}
#Создаем каталог для бекапов
CheckPath $BackupPath | Out-Null
#Передайте нежелательные результаты команд / вызовов функций
#в вызываемой функции через "... | Out-Null",
#а затем просто верните нужную вещь.
write-host $BackupPath
#Импортирую установленный модуль
Import-Module Posh-SSH
$username = "username"
$password = "password"
$Port = "22"
#$fnamebackup = "backup_$(Get-Date -Format ddMMyyyy)"
#$fnamersc = "backup_$(Get-Date -Format ddMMyyyy)"
$fnamebackup = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
$fnamersc = "backup_$(Get-Date -Format HH_mm_dd_MM_yyyy)"
function bkprtr {
param($ipaddr)
$secpassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$Cred = New-Object System.Management.Automation.PSCredential ($username, $secpassword)
$ssh = New-SSHSession $ipaddr -AcceptKey -Credential $Cred -ErrorAction Stop -Port 22
$outbackup = (Invoke-SSHCommand $ssh -Command "/system backup save name=$fnamebackup dont-encrypt=yes" -EnsureConnection).Output
$outrsc = (Invoke-SSHCommand $ssh -Command "export file=$fnamersc" -EnsureConnection).Output
#set name mikrotik
$mikrotikname = (Invoke-SSHCommand $ssh -Command "/system identity print" -EnsureConnection).Output
#Форматируем значение переменной $mikrotikname
$fa = $mikrotikname | out-file $BackupPath\name.txt
$fb = Get-Content $BackupPath\name.txt -first 1
$fc = $fb.Split(": ")[-1]
$fc
#Создаем внутри каталога C:\backup каталог с именем Mikrotik,
#ключ Force обязателен, т.к. каталог уже есть и каждый последующий день будет тут же
$MName = new-item -Path $BackupPath\$fc -Type Directory -Force
$MName
#Делаем бекапы backup и бекап конфигурации rsc и через ftp забираем их на каталог c:\backup\<mikrotik_name>
#А после удаляем с Mikrotik
if($outbackup.Trim() -eq "Configuration backup saved")
{
$sftp = New-SFTPSession $ipaddr -AcceptKey -Credential $Cred
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamebackup.backup" -LocalPath "$MName\" -Overwrite
Get-SFTPFile -SFTPSession $sftp -RemoteFile "/$fnamersc.rsc" -LocalPath "$MName\" -Overwrite
Start-Sleep 2
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamebackup.backup" -Force
Remove-SFTPItem -SFTPSession $sftp -Path "/$fnamersc.rsc" -Force
Remove-SFTPSession $sftp
}
Remove-SSHSession $ssh
}
foreach ($ip in gc C:\script\list.txt) {bkprtr($ip)}
А в файл list.txt директории script вносим IP адрес всех Mikrotik'ов для которых хотим сделать резервную копию.
Результат сделанный бекапов моих микротиков:


Шаг №4: Итого данный скрипт был перенесен на рабочее окружение где я работаю, и вся сеть у меня строится на базе маршрутизаторов Mikrotik и он (скрипт) успешно введен в эксплуатацию. К тому же все бекапы у меня хранятся каталоге которые обязательно синхронизируется с персональным облаком на базе Ubuntu 18.04 Server + OwnCloud 10. Об этом вы можете почитать в заметке «Наработки в OwnCloud + BitLocker на рабочем месте»
На заметку: Первый раз запускаю скрипт из «Шаг №2» придется согласиться с
Для продолжения требуется поставщик NuGet
Для взаимодействия с репозиториями на основе NuGet модулю PowerShellGet требуется версия поставщика NuGet «2.8.5.201»
или более новая. Поставщик NuGet должен быть доступен в «C:\Program Files\PackageManagement\ProviderAssemblies» или
«C:\Users\aolloadm\AppData\Local\PackageManagement\ProviderAssemblies». Поставщик NuGet можно также установить,
выполнив команду «Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force». Вы хотите, чтобы модуль
PowerShellGet установил и импортировал поставщик NuGet прямо сейчас?
[Y] Да — Y [N] Нет — N [S] Приостановить — S [?] Справка (значением по умолчанию является «Y»): Y
Ненадежный репозиторий
Идет установка модулей из ненадежного репозитория. Если вы доверяете этому репозиторию, измените его значение
InstallationPolicy, запустив командлет Set-PSRepository. Вы действительно хотите установить модули из «PSGallery»?
[Y] Да — Y [A] Да для всех — A [N] Нет — N [L] Нет для всех — L [S] Приостановить — S [?] Справка
(значением по умолчанию является «N»):Y
Ну а далее скрипт успешно отработает и будем мне счастье.
На заметку: от 23.05.2023 в данной заметке есть продолжение или скорее можно назвать как начало этой с нюансами которые были опущены когда она писалась, мол заработала и ладно, см здесь "Преднастройка резервного копирования Mikrotikов через PowerShell"
На этом моя задача завершена, у меня есть самолично написанная наработка по централизованному резервному копированию маршрутизаторов Mikrotik. С уважением автор блога Олло Александр aka ekzorchik.