<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B5%D0%BA%D0%B0%D0%BF%D0%B8%D0%BC_Mikrotik_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_SSH_%D0%B8_SCP</id>
	<title>Бекапим Mikrotik с помощью SSH и SCP - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://support.qbpro.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%91%D0%B5%D0%BA%D0%B0%D0%BF%D0%B8%D0%BC_Mikrotik_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_SSH_%D0%B8_SCP"/>
	<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%91%D0%B5%D0%BA%D0%B0%D0%BF%D0%B8%D0%BC_Mikrotik_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_SSH_%D0%B8_SCP&amp;action=history"/>
	<updated>2026-04-03T20:32:29Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.38.1</generator>
	<entry>
		<id>https://support.qbpro.ru/index.php?title=%D0%91%D0%B5%D0%BA%D0%B0%D0%BF%D0%B8%D0%BC_Mikrotik_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_SSH_%D0%B8_SCP&amp;diff=3072&amp;oldid=prev</id>
		<title>imported&gt;Vix: Новая страница: «Если заглянуть назад в прошлое когда еще не было Ansible или других систем удаленного админ...»</title>
		<link rel="alternate" type="text/html" href="https://support.qbpro.ru/index.php?title=%D0%91%D0%B5%D0%BA%D0%B0%D0%BF%D0%B8%D0%BC_Mikrotik_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_SSH_%D0%B8_SCP&amp;diff=3072&amp;oldid=prev"/>
		<updated>2020-08-13T10:24:18Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «Если заглянуть назад в прошлое когда еще не было Ansible или других систем удаленного админ...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Если заглянуть назад в прошлое когда еще не было Ansible или других систем удаленного администрирования linux мы пользовались только своими подручными скриптами, позволяли им подключаться к системам по ssh с помощью ключей. Думаю и по сей день многие использую свои скрипты взамен системам централизованного управления.&lt;br /&gt;
&lt;br /&gt;
Я и решил поделиться своим опытом.&lt;br /&gt;
Нужно было написать скрипт который умеет ходить на заданное количество хостов и бекапит некоторые файлы конфигураций.&lt;br /&gt;
&lt;br /&gt;
Логика работы выстроилась сразу. Зайти на хост по ssh, выполнить некоторые команды для подготовки бекапов и забрать готовые файлы с помощью scp.&lt;br /&gt;
&lt;br /&gt;
Первым делом нужно создать пользователя который будет иметь доступ к необходимым данным с необходимыми правами. Тут я думаю каждый сам сможет разобраться в какую группу определить пользователя. Главное помнить:&lt;br /&gt;
&lt;br /&gt;
    Имя пользователя для работы входа без пароля должно быть одинаковое на всех хостах или придется для каждого хоста указывать свой логин что не есть удобно;&lt;br /&gt;
    Пользователь должен иметь доступ на хост без пароля (ssh-keygen в помощь) ;&lt;br /&gt;
    Пользователь должен иметь доступ к файлам которые необходимо забрать.&lt;br /&gt;
&lt;br /&gt;
тут можно пойти несколькими путями 1) выполнить команду в удаленном shell для сбора необходимых данных подлежащих резервированию и потом их забрать 2) настроить cron на хосте и выполнять команду сбора данных а уже потом, когда нибудь, заходить на хост и забирать готовые пирожки бекапы. Конечно мы пойдем по первому пути&lt;br /&gt;
&lt;br /&gt;
Имеем такую конфигурацию —&lt;br /&gt;
10 хостов (Mikrotik) с которых необходимо получить два типа бекапов — бинарный (для восстановления с нуля) и конфигурацию без паролей и сертификатов для заливки на работающий конфиг. Так же в полном нашем распоряжении имеется машина с debian 8 на борту назовем ее сервер (и не важно что это контейнер, важно что это дебиан) ну и конечно куда ж без него — zabbix-server.&lt;br /&gt;
&lt;br /&gt;
    IP Mikrotik — 10.10.0.1, 10.10.1.1, 10.10.2.1, 10.10.3.1, 10.10.4.1, 10.10.5.1, 10.10.6.1, 10.10.7.1, 10.10.8.1, 10.10.9.1;&lt;br /&gt;
    IP Zabbix-server — 10.10.10.10;&lt;br /&gt;
&lt;br /&gt;
Для упрощения задачи zabbix-hostname будет в формате mik(третий октет в десятичном формате).host таким образом получаем —&lt;br /&gt;
&lt;br /&gt;
    Zabbix hostnames — mik0.host, mik1.host, mik2.host, mik3.host, mik4.host, mik5.host, mik6.host, mik7.host, mik8.host, mik9.host&lt;br /&gt;
&lt;br /&gt;
Если кто не помнит — zabbix hostname мы указываем в файле настроек zabbix-agent(агент тут не нужен, но все же) и на сервере zabbix в web-ui.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Первым делом создаем на нашем сервере ключ RSA. Почему RSA — да вообщем то по привычке, кстати, старые версии RB поддерживают только DSA, а все что свежее 6.35 уже работает с RSA и DSA, потому смотрите по обстановке, можно и обновиться, как сделал я :), если у вас уже есть готовый ключ — пропускайте этот шаг.&lt;br /&gt;
&lt;br /&gt;
 ssh-keygen -t RSA&lt;br /&gt;
&lt;br /&gt;
Переносим содержимое файла $HOME/.ssh/id_rsa.pub с сервера на наши хосты. Я ленивый и для Mikrotik использовал winbox.&lt;br /&gt;
&lt;br /&gt;
Для линукс можно сделать проще создаем скрипт sh и запускаем его от имени пользователя которым мы будем ходить на хост за бекапами (на хостах пользователь уже должен быть) такого содержания —&lt;br /&gt;
Если у вас ключ DSA то измените id_rsa.pub на id_dsa.pub&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/env bash&lt;br /&gt;
 &lt;br /&gt;
 hosts=(10.10.0.1 10.10.1.1 10.10.2.1 10.10.3.1 10.10.4.1 10.10.5.1 10.10.6.1 10.10.7.1 10.10.8.1 10.10.9.1)&lt;br /&gt;
 username='user'&lt;br /&gt;
 for host in ${hosts[*]} &lt;br /&gt;
         do&lt;br /&gt;
                 cat $HOME/.ssh/id_rsa.pub | ssh -o &amp;quot;StrictHostKeyChecking no&amp;quot; ${user}@${host} 'cat &amp;gt;&amp;gt; ~/.ssh/authorized_keys'&lt;br /&gt;
         done &lt;br /&gt;
 &lt;br /&gt;
Запускаем его и вводим поочередно пароли для всех 10 серверов.&lt;br /&gt;
&lt;br /&gt;
В скрипте есть подвох — специально не стал добавлять проверку, а то совсем забуду как клавиши нажимать -) если вы все прочитали то подвох не сработает.&lt;br /&gt;
&lt;br /&gt;
Тааак, что там дальше, а, точно, мы уже умеем ходить без пароля на все хосты под пользователем допустим user.&lt;br /&gt;
Мы же хотим получить конфиги Mikrotik. Собственно приступим.&lt;br /&gt;
&lt;br /&gt;
Создаем на сервере вот такой вот скрипт —&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/env bash&lt;br /&gt;
 &lt;br /&gt;
 hosts=(10.10.0.1_mik0.host_22 \&lt;br /&gt;
        10.10.1.1_mik1.host_22 \&lt;br /&gt;
        10.10.2.1_mik2.host_22 \&lt;br /&gt;
        10.10.3.1_mik3.host_22 \&lt;br /&gt;
        10.10.4.1_mik4.host_22 \&lt;br /&gt;
        10.10.5.1_mik5.host_22 \&lt;br /&gt;
        10.10.6.1_mik6.host_22 \&lt;br /&gt;
        10.10.7.1_mik7.host_22 \&lt;br /&gt;
        10.10.8.1_mik8.host_22 \&lt;br /&gt;
        10.10.9.1_mik9.host_22 )&lt;br /&gt;
 # bash array of values. All values are arrays too, after remove splitter &amp;quot;_&amp;quot;. &lt;br /&gt;
 # Sub array content IP_ZABBIX-HOSTNAME_SSH-DAEMON-PORT&lt;br /&gt;
 cdate=`date +%d-%m-%Y` # System date =) Hi Max&lt;br /&gt;
 dir=&amp;quot;/mik_backup/&amp;quot; # Storage for backups&lt;br /&gt;
 cmd=&amp;quot;/system backup save name=backup; export file=backup.rsc hide-sensitive&amp;quot; # command that do the preparation of backup&lt;br /&gt;
 username=&amp;quot;user&amp;quot; # SSH user&lt;br /&gt;
 zabbix_hp=(10.10.10.10 10051) # IP then PORT&lt;br /&gt;
 age=&amp;quot;30&amp;quot; # remove all backups older then 30 days&lt;br /&gt;
 itemname=&amp;quot;backup&amp;quot; # zabbix item&lt;br /&gt;
 error_value=&amp;quot;1&amp;quot; # error value for trigger&lt;br /&gt;
 value=&amp;quot;0&amp;quot; # good value =)&lt;br /&gt;
 &lt;br /&gt;
 for host in ${hosts[*]} # Get values from main list&lt;br /&gt;
 do&lt;br /&gt;
 hostname=($(echo ${host} | tr &amp;quot;_&amp;quot; &amp;quot; &amp;quot;)) # Get values from sub list&lt;br /&gt;
 ssh ${username}@${hostname[0]} -o &amp;quot;StrictHostKeyChecking no&amp;quot; -p${hostname[2]} &amp;quot;${cmd}&amp;quot;&lt;br /&gt;
 new_dir=&amp;quot;${HOME}${dir}${hostname[1]}/${cdate}&amp;quot;&lt;br /&gt;
 mkdir -p ${new_dir}&lt;br /&gt;
 scp -P${hostname[2]} ${username}@${hostname[0]}:backup.backup  ${new_dir}&lt;br /&gt;
 scp -P${hostname[2]} ${username}@${hostname[0]}:backup.rsc ${new_dir}&lt;br /&gt;
 check=`find ${new_dir} -type f -name backup.*`&lt;br /&gt;
 if [ &amp;quot;${check}&amp;quot; == &amp;quot;&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${error_value}&lt;br /&gt;
 else&lt;br /&gt;
 zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${value}&lt;br /&gt;
 fi &lt;br /&gt;
 done&lt;br /&gt;
 find ${HOME}${dir} -mindepth 2 -mtime ${age} -type d -exec rm -rf {} \; #clear dirs&lt;br /&gt;
&lt;br /&gt;
Постарался максимально прокомментировать все что происходит в скрипте. Давайте разберем, что же тут такое делается.&lt;br /&gt;
&lt;br /&gt;
Тут мы говорим каким интерпретатором будем выполнять код&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/env bash&lt;br /&gt;
  &lt;br /&gt;
Тут создаем массив с необходимыми нам данными для подключения к хостам и отправки данных в zabbix&lt;br /&gt;
&lt;br /&gt;
 hosts=(10.10.0.1_mik0.host_22 \&lt;br /&gt;
        10.10.1.1_mik1.host_22 \&lt;br /&gt;
        10.10.2.1_mik2.host_22 \&lt;br /&gt;
        10.10.3.1_mik3.host_22 \&lt;br /&gt;
        10.10.4.1_mik4.host_22 \&lt;br /&gt;
        10.10.5.1_mik5.host_22 \&lt;br /&gt;
        10.10.6.1_mik6.host_22 \&lt;br /&gt;
        10.10.7.1_mik7.host_22 \&lt;br /&gt;
        10.10.8.1_mik8.host_22 \&lt;br /&gt;
        10.10.9.1_mik9.host_22 ) &lt;br /&gt;
&lt;br /&gt;
Тут думаю только одна переменная нуждается в объяснении — $cmd. Это две команды которые выполняются на Mikrotik последовательно. Первая создает бинарный бекап&lt;br /&gt;
вторая создает скрипт с настройками без выгрузки паролей и ключей шифрования.&lt;br /&gt;
&lt;br /&gt;
 cdate=`date +%d-%m-%Y` # System date =) Hi Max &lt;br /&gt;
 dir=&amp;quot;/mik_backup/&amp;quot; # Storage for backups&lt;br /&gt;
 cmd=&amp;quot;/system backup save name=backup; export file=backup.rsc hide-sensitive&amp;quot; # command to do the preparation of backup &lt;br /&gt;
 username=&amp;quot;user&amp;quot; # SSH user&lt;br /&gt;
 zabbix_hp=(10.10.10.10 10051) # IP then PORT&lt;br /&gt;
 age=&amp;quot;30&amp;quot; # remove all backups older then 30 days&lt;br /&gt;
 itemname=&amp;quot;backup&amp;quot; # zabbix item&lt;br /&gt;
 error_value=&amp;quot;1&amp;quot; # error value for trigger&lt;br /&gt;
 value=&amp;quot;0&amp;quot; # good value =)&lt;br /&gt;
&lt;br /&gt;
Основное тело программы. На входе в цикл мы имеем массив содержащийся в переменной $hosts. Цикл работает так — берем первый элемент массива, у нас он равен 10.10.0.1_mik0.host_22 и начинаем с ним работать. Первым же действием мы заносим в переменную $hostname массив созданный из первого элемента массива $hosts. Делаем мы это с помощью команды tr по сути как в python эмитируем действие метода строки .split(). Получается вполне сносно. Мы получаем 3 элемента в массиве $hostname. Первый элемент — ip хоста. Второй элемент — zabbix-hostname. Третий элемент — ssh-port.&lt;br /&gt;
Дальше мы обращаемся к этим элементам с помощью индекса, опять же python.&lt;br /&gt;
Далее формируем древо каталогов для хранения файлов и указываем scp какие файлы забирать. Прошу не пинать — если кто подскажет как с помощью scp в такой конструкции обращаться к файлам по маске + в карму.&lt;br /&gt;
После того как мы получили файлы — отправляем в zabbix сообщение об успехе.&lt;br /&gt;
Проверка создания конфига производится простым поиском файла в каталоге назначения. Можно было сделать сравнение md5 на Mikrotik и в каталоге назначения, но это уже другая история, хотя я так делал.&lt;br /&gt;
&lt;br /&gt;
 for host in ${hosts[*]} # Get values from main list&lt;br /&gt;
 do&lt;br /&gt;
 hostname=($(echo ${host} | tr &amp;quot;_&amp;quot; &amp;quot; &amp;quot;)) # Get values from sub list&lt;br /&gt;
 ssh ${username}@${hostname[0]} -o &amp;quot;StrictHostKeyChecking no&amp;quot; -p${hostname[2]} &amp;quot;${cmd}&amp;quot;&lt;br /&gt;
 new_dir=&amp;quot;${HOME}${dir}${hostname[1]}/${cdate}&amp;quot;&lt;br /&gt;
 mkdir -p ${new_dir}&lt;br /&gt;
 scp -P${hostname[2]} ${username}@${hostname[0]}:backup.backup  ${new_dir}&lt;br /&gt;
 scp -P${hostname[2]} ${username}@${hostname[0]}:backup.rsc ${new_dir}&lt;br /&gt;
 check=`find ${new_dir} -type f -name backup.*`&lt;br /&gt;
 if [ &amp;quot;${check}&amp;quot; == &amp;quot;&amp;quot; ]&lt;br /&gt;
 then&lt;br /&gt;
 zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${error_value} &lt;br /&gt;
 else&lt;br /&gt;
 zabbix_sender -z ${zabbix_hp[0]} -p ${zabbix_hp[1]} -s ${hostname[1]} -k ${itemname} -o ${value}&lt;br /&gt;
 fi&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
Тут чистим место. Переменная $age поможет нам сохранить бекапы столько сколько нам этого надо&lt;br /&gt;
&lt;br /&gt;
 find ${HOME}${dir} -mindepth 2 -mtime ${age} -type d -exec rm -rf {} \; #clear dirs&lt;br /&gt;
&lt;br /&gt;
Теперь самое тривиальное.&lt;br /&gt;
Создаем на сервере zabbix шаблон или просто элемент данных типа zabbix_trapper на наших узлах которые мы заблаговременно добавили на мониторинг в zabbix.&lt;br /&gt;
Не буду выкладывать шаблон из одного элемента данных и одного триггера. Думаю сделать его сможет каждый. Главное помнить, если хосты мониторятся через zabbix-proxy, данные вы должны отправлять на zabbix-proxy. В ином случае отправляем все на zabbix-server.&lt;br /&gt;
Не важно даже какой будет IP у этих хостов в zabbix web ui. Важно чтобы совпадали hostname с данными в скрипте.&lt;br /&gt;
&lt;br /&gt;
PS. На все скрипты нужно кинуть chmod +x так их можно будет запускать без вызова интерпретатора.&lt;br /&gt;
P.S.S Чтобы передавать scp список файлов для резервного копирования на linux можно сделать еще одни массив и вложить его в цикл for. Можно сделать все в виде получаемых параметров. Ну вообщем можно развлечься.&lt;br /&gt;
&lt;br /&gt;
'''ИСТОЧНИК:'''&lt;br /&gt;
&amp;lt;hr&amp;gt;&lt;br /&gt;
* [https://habr.com/ru/post/345820/ Бекапим Mikrotik с помощью SSH и SCP]&lt;/div&gt;</summary>
		<author><name>imported&gt;Vix</name></author>
	</entry>
</feed>