Скрипт перезагрузки микротика с удаленной машины

Обсуждение ПО и его настройки
djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

Ребята всем добрый день, подскажите какой либо скрипт для удаленной перезагрузки микротика.
Либо что бы он по телнету заходил и задавал команду /system reboot
Либо что бы можно было через API тоже самое сделать.

По телнету пробовал так:
#!/bin/bash

(
sleep 3
echo "login"
sleep 5
echo "pass"
sleep 5
echo "/system reboot y"
) | telnet 192.168.0.12


в ответ зашел на микротик, но при вводе команд получаю кучу иероглифов:


# ./mik2.sh
Trying 192.168.0.12...
Connected to 192.168.0.12.
Escape character is '^]'.

MikroTik v5.21
Login: login
Password:



MMM MMM KKK TTTTTTTTTTT KKK
MMMM MMMM KKK TTTTTTTTTTT KKK
MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK
MMM MM MMM III KKKKK RRR RRR OOO OOO TTT III KKKKK
MMM MMM III KKK KKK RRRRRR OOO OOO TTT III KKK KKK
MMM MMM III KKK KKK RRR RRR OOOOOO TTT III KKK KKK

MikroTik RouterOS 5.21 © 1999-2012 http://www.mikrotik.com/

^[[?62;1;2;6;7;8;9c^[[48;3R
Connection closed by foreign host.


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

Код: Выделить всё

#!/usr/bin/perl

use Net::Telnet ();

$t = new Net::Telnet ;

$user="username";
$pass="password";
$epass="enable";
$host="10.100.100.1";

print("Подключаемся к: $host\n");
$t=new Net::Telnet(Host => "$host", Timeout => 30);
$t->max_buffer_length(500000);
($prematch, $match)=$t->waitfor('/login:.*$/i');
print("$match $user\n");
$t->print("$user");
($prematch, $match)=$t->waitfor('/password:.*$/i');
print("$match $pass\n");
$t->print("$pass");
($prematch, $match)=$t->waitfor('/>.*$/i');
$t->print("/system reboot y");
$t->waitfor('/>.*$/i');
print("Отключаемся от: $host\n");
$t->close;

попробуйте как нибудь так, не перле


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

simpl3x писал(а):попробуйте как нибудь так, не перле

спасибо, но не совсем корректно отрабатывает данная команда:
$t->print("/system reboot y");

т.е. если написано так в скрипте, то микротик не ребутиться.


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

чуть изменил окончание
$t->print("/system reboot");
($prematch, $match)=$t->waitfor('/].*$/i');
$t->print("y\n");
$t->waitfor('/shortly.*$/i');
print("Отключаемся от: $host\n");
$t->close;


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

Скрипт работает пока роутер сильно не нагружен, как только появляется сильная нагрузка, то начинает подтупливать и не всегда выполняется.

Решил попробовать сделать через Perl на API.
Библиотеку Milrotik API залили на сервер в /etc/perl

создал пока вот такой простенький скрипт:

Код: Выделить всё

#!/usr/bin/perl -w
use strict;
use vars qw($error_msg $debug);
use Mtik;

my($mtik_host) = '192.168.0.12';
my($mtik_username) = 'login';
my($mtik_password) = 'pass';
my($mtik_port) = '58728';

print "Logging in to Mtik: $mtik_host\n";
if (Mtik::login($mtik_host,$mtik_username,$mtik_password))
{

    Mtik::logout;
}


вроде бы работает, если API на стандартном порту.
А мне надо подключиться не совсем на стандартный, но это я думаю можно поправить через библиотеку API.
Теперь осталось вроде бы отправить ему команду /system/reboot
но с логикой отправки команд на микротик через API так и не разобрался(((

Надеюсь на вашу помошь.


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

Код: Выделить всё

Mtik::mtik_cmd('/system/reboot');

как то так вроде


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

simpl3x писал(а):

Код: Выделить всё

Mtik::mtik_cmd('/system/reboot');

как то так вроде

ок, спасибо попробую завтра.


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

В общем получаю в ответ это

Код: Выделить всё

# ./mik5.pl 
Logging in to Mtik: 192.168.0.12
Logged in to 192.168.0.12 as sergej
Can't use an undefined value as a HASH reference at /etc/perl/Mtik.pm line 355.


строка на которую ругается скрипт

Код: Выделить всё

sub mtik_cmd
{
    my($cmd) = shift;
    my(%attrs) = %{(shift)};
    $error_msg = '';
    my(@command);
    push(@command,$cmd);
    foreach my $attr (keys (%attrs))
    {
        push(@command,'=' . $attr . '=' . $attrs{$attr});
    }
    my($retval,@results) = talk(\@command);
    if ($retval > 1)
    {
        $error_msg = $results[0]{'message'};
    }
    return ($retval,@results);
}


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

какая из них 355


djserg-minyar
Сообщения: 61
Зарегистрирован: 19 июн 2012, 06:34

my(%attrs) = %{(shift)};


Ответить