Форум программистов, компьютерный форум, киберфорум
Mikrotik
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 13
1

Mikrotik scripts (условие выполнения)

06.10.2019, 21:08. Показов 6784. Ответов 7

Author24 — интернет-сервис помощи студентам
Коллеги есть скрипт в котором есть сл. строки:
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
    do {/tool fetch url="http://xxx.xx/http/send-message\?username=user&to=$uname7 &message=$pass"} on-error={};
    do {/ip firewall address-list add list="sendsms" address="$uname7" timeout="5m"} on-error={};


Есть адрес-лист "sendsms". в поле "адрес" которого указан номер телефона вида "7XXXXXXXXXX"
Задача чтобы указанные строки скрипта выполнялись при условии отсутствия в адрес-листе номера телефона равного переменной "$uname7"

что нужно дописать в каждую из строк что бы команда выполнилась при данном условии?
Очень надеюсь на вашу помощь.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.10.2019, 21:08
Ответы с готовыми решениями:

Объединить Mikrotik - Netis - Mikrotik
Всем доброго дня. Есть Mikrotik hAP Lite к нему подключен сетевой кабель, соответственно из...

Mikrotik TO Mikrotik (VPN)
Подскажите пожалуйста! Организовал VPN тунель м/у 2-мя Микротиками. Проблема в том что за...

Условие if. Как сделать повтор выполнения if-а, если условие не удовлетворяет требованиям в данный момент
Суть вопроса такова. В процессе работы программы запускается несколько потоков. Один из них...

Условие для выполнения
Ребята, помогите написать условие Логически это будет звучать следующим образом: Если (через...

7
Модератор
Эксперт по компьютерным сетям
1762 / 671 / 141
Регистрация: 10.06.2009
Сообщений: 2,604
06.10.2019, 22:11 2
Да легко:
Bash
1
2
3
4
5
6
if ($sendsms=$uname7) do={
    do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
    do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
    do {/tool fetch url="http://xxx.xx/http/send-message\?username=user&to=$uname7 &message=$pass"} on-error={};
    do {/ip firewall address-list add list="sendsms" address="$uname7" timeout="5m"} on-error={};
}
0
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 13
07.10.2019, 00:33  [ТС] 3
Уважаемый NoNaNe, видимо это гениально в своей простоте, но я будучи по природе своей несколько слабоумен, не могу уразуметь. От куда возьмется переменная "$sendsms" и точно ли это сработает в моем случае. Мне думалась что скрипт как то должен заглядывать в адрес лист и искать совпадение известной переменной "$uname7" в поле адрес. Поясню, есть скрипт sms авторизации на хотспоте. В нем есть загвоздка, нет никакого ограничение на количество генераций кодов доступа и отправки смс, соответственно люди могут послать довольно много смс. Дабы этого избежать я придумал после отправки первой смс вносить номер телефона в адрес лист на пять минут, что бы перед генерацией нового кода скрипт смотрел отправлял ли он уже смс на этот номер. Добавить номер в лист на это ума хватило. А вот как заставить скрипт в нужных местах с этим адрес листом сравниваться, я уже догнать не могу. (
Если может быть полезным, вот весь скрипт:
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#Search number in log hotspot
       :foreach line in=[/log find buffer=hotspot message~"login failed"] do={
        :do {:local content [/log get $line message];
         :put $content;
         :local pos1 [:find $content " (" 0];
         :put $pos1;
         :if ($pos1 != " ") do={ 
          :local uname ""; 
          :local uname7 "";
          :local uname8 "";
          :local uname9 "";
          :local phone ""; 
          :if ([:pick $content ($pos1-11)] = "8") do={ 
           :set uname [:pick $content ($pos1-10) ($pos1-0)];  
           :put $uname;
           :set uname7 [:put ("7" . {$uname})]
           :set uname8 [:put ("8" . {$uname})]
           :put $uname7
           :put $uname8
          #Password generation
           :local date [/system clock get time]; 
           :local hour [:pick $date 0 2]; 
           :local min [:pick $date 3 5]; 
           :local sec [:pick $date 6 8]; 
           :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
           :put $usernumber;
           :global pass 27394; 
           :set pass ($hour * $min * $sec - $usernumber); 
           :if ($pass = 0) do={ 
            :set pass 6524;
            }
           :put $pass;
           #Add user to hotspot / user-manager 
           do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname;} on-error={};
           do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
           #Email
           do {/tool e-mail send to="xxx@xxx.xx" subject="Login8 $uname password $pass" body="Login $uname password $pass"} on-error={};    
           }
          :if ([:pick $content ($pos1-10)] = "9") do={ 
           :set uname [:pick $content ($pos1-10) ($pos1-0)];  
           :put $uname;
           :set uname7 [:put ("7" . {$uname})]
           :set uname8 [:put ("8" . {$uname})]
           :put $uname7
           :put $uname8
           #Password generation 
           :local date [/system clock get time]; 
           :local hour [:pick $date 0 2]; 
           :local min [:pick $date 3 5]; 
           :local sec [:pick $date 6 8]; 
           :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
           :put $usernumber;
           :global pass 27394; 
           :set pass ($hour * $min * $sec - $usernumber); 
           :if ($pass = 0) do={ 
            :set pass 6524;
            }
           :put $pass;
           #Add user to hotspot / user-manager 
           do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
           do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
           #sms to wwww.ww
           do {/tool fetch url="http://wwww.ww/http/send-message\?username=admin&password=xxxxxxxxxx&to=$uname7&message-type=sms.automatic&message=$pass"} on-error={};
           do {/ip firewall address-list add list="sendsms" address="$uname7" timeout="5m"} on-error={};
           #Email
           #do {/tool e-mail send to="www@www.ww" subject="Login9 $uname password $pass" body="Login $uname password $pass"} on-error={};    
           }
          :if ([:pick $content ($pos1-11)] = "7") do={ 
           :set uname [:pick $content ($pos1-10) ($pos1-0)];  
           :put $uname;
           :set uname7 [:put ("7" . {$uname})]
           :set uname8 [:put ("8" . {$uname})]
           :put $uname7
           :put $uname8
           #Password generation 
           :local date [/system clock get time] 
           :local hour [:pick $date 0 2] 
           :local min [:pick $date 3 5] 
           :local sec [:pick $date 6 8] 
           :local usernumber [:pick $content ($pos1-7) ($pos1-4)];
           :global pass 27394 
           :set pass ($hour * $min * $sec - $usernumber) 
           :if ($pass = 0) do={ 
            :set pass 6524 
            } 
           :put $pass
           #Add user to hotspot / user-manager 
           do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname;} on-error={};
           do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
           #Email
           do {/tool e-mail send to="xxx@xxx.xx" subject="Login7 $uname password $pass" body="Login $uname password $pass"} on-error={};    
           }
         }
        }
       }
       
       # Clear hostpot log
       /system logging action set hotspot memory-lines=1;
       /system logging action set hotspot memory-lines=1000;
0
Модератор
Эксперт по компьютерным сетям
1762 / 671 / 141
Регистрация: 10.06.2009
Сообщений: 2,604
07.10.2019, 15:39 4
Лучший ответ Сообщение было отмечено PAPIruss как решение

Решение

PAPIruss, тогда нужно проверить на вхождения.
Bash
1
2
3
4
5
local sendtest yes;
foreach i in=[/ip fi ad print as-value where list=sendsms] do={
if (($i->"address")=$uname7) do={
set $sendtest no;
}}
Теперь если $sendtest=yes то такого адреса нет в списке, а вот если $sendtest=no то он есть.
И Я-бы биндил номер в комментарии к адрес листу, что-бы ещё и по ip проверять.

Добавлено через 1 минуту
Цитата Сообщение от PAPIruss Посмотреть сообщение
#Password generation
Думаю можно перед генерацией пароля и проверять.
1
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 13
07.10.2019, 16:23  [ТС] 5
Уважаемый NoNaMe.
Я правильно понимаю что с вашими правками скрипт должен выглядеть так:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        
:if ([:pick $content ($pos1-10)] = "9") do={ 
           :set uname [:pick $content ($pos1-10) ($pos1-0)];  
           :put $uname;
           :set uname7 [:put ("7" . {$uname})]
           :set uname8 [:put ("8" . {$uname})]
           :put $uname7
           :put $uname8
           local sendtest yes;
            foreach i in=[/ip fi ad print as-value where list=sendsms] do={
            if (($i->"address")=$uname7) do={
            set $sendtest no;
            }
           #Password generation 
           :local date [/system clock get time]; 
           :local hour [:pick $date 0 2]; 
           :local min [:pick $date 3 5]; 
           :local sec [:pick $date 6 8]; 
           :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
           :put $usernumber;
           :global pass 27394; 
           :set pass ($hour * $min * $sec - $usernumber); 
           :if ($pass = 0) do={ 
            :set pass 6524;
            }
           :put $pass;
           #Add user to hotspot / user-manager 
           if ($sendtest=True) do={
            do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
            do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
            do {/tool fetch url="http://xxx.xx/http/send-message\?username=user&to=$uname7 &message=$pass"} on-error={};
            do {/ip firewall address-list add list="sendsms" address="$uname7" timeout="5m"} on-error={};
            }
0
Модератор
Эксперт по компьютерным сетям
1762 / 671 / 141
Регистрация: 10.06.2009
Сообщений: 2,604
07.10.2019, 17:31 6
Лучший ответ Сообщение было отмечено PAPIruss как решение

Решение

Цитата Сообщение от PAPIruss Посмотреть сообщение
Bash
1
if ($sendtest=True)
Я выше когда писал ошибся, у RouterOS True это yes, а False это no. Должно быть:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        
:if ([:pick $content ($pos1-10)] = "9") do={ 
           :set uname [:pick $content ($pos1-10) ($pos1-0)];  
           :put $uname;
           :set uname7 [:put ("7" . {$uname})]
           :set uname8 [:put ("8" . {$uname})]
           :put $uname7
           :put $uname8
           local sendtest yes;
            foreach i in=[/ip fi ad print as-value where list=sendsms] do={
            if (($i->"address")=$uname7) do={
            set $sendtest no;
            }
           #Password generation 
           :local date [/system clock get time]; 
           :local hour [:pick $date 0 2]; 
           :local min [:pick $date 3 5]; 
           :local sec [:pick $date 6 8]; 
           :local usernumber [:pick $content ($pos1-7) ($pos1-5)];
           :put $usernumber;
           :global pass 27394; 
           :set pass ($hour * $min * $sec - $usernumber); 
           :if ($pass = 0) do={ 
            :set pass 6524;
            }
           :put $pass;
           #Add user to hotspot / user-manager 
           if ($sendtest=yes) do={
            do {/tool user-manager user add username=$uname password=$pass customer=admin copy-from=test disabled=no phone=$uname7;} on-error={};
            do {/tool user-manager user set password=$pass number=[find username=$uname]} on-error={};
            do {/tool fetch url="http://xxx.xx/http/send-message\?username=user&to=$uname7 &message=$pass"} on-error={};
            do {/ip firewall address-list add list="sendsms" address="$uname7" timeout="5m"} on-error={};
            }
2
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 13
07.10.2019, 17:36  [ТС] 7
Дорогой NoNaMe спасибо за труд.
В среду доберусь до тестового стенда и попробую, если работает то с меня респект и шоколадка )
0
0 / 0 / 0
Регистрация: 28.02.2017
Сообщений: 13
09.10.2019, 14:33  [ТС] 8
Дорогой NoNaMe!
Спасибо огромное, все получилось.
Остался еще один вопрос, в личку написал )
0
09.10.2019, 14:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2019, 14:33
Помогаю со студенческими работами здесь

Условие выполнения цикла
#include <iostream.h> void main() { char a; int r=1; cin>>a; if(a==r) {...

Условие выполнения кода
Есть кусок кода t(document).on("click", ".js-btn-buy", function(e) { ...

Условие выполнения команды в цикле
Здравствуйте! Столкнулся с очень странной ошибкой. Имею двухмерный массив нулей и единиц и...

Факториалы и условие его выполнения
Неправильно считает факториал. 1)Если факториал меньше 0 вывод 0. 2)Если факториал равен 0 вывод...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru