XuHT Posted February 23, 2018 Posted February 23, 2018 Привет! Ищу совета в написании скрипта на баше. Есть необходимость стягивать по SNMP наличие вланов с порта с коммутаторов D-LINK, ZyXEL, CISCO. В общем как все происходит 1) Стягиваю со свитча все вланы 2) Вычисляю по каждому влану присутствие на порту и untagged Свитч мне возвращает это в хексе. К примеру получается так: member ports 1 = 00 00 00 00 00 00 00 00 3 = C0 00 00 00 00 00 00 00 10 = FF C0 00 00 00 00 00 00 Untagged ports 1 = 00 00 00 00 00 00 00 00 3 = 00 00 00 00 00 00 00 00 10 = FF 00 00 00 00 00 00 00 В принципе не сложно скриптом перевести в бинарник, отсеяв лишние нули Но как это потом сопоставить с номерами портов? Необходимо вывести информацию в виде (ну или примерно так) 1 = Tag 3: Un 10 2 = Tag 3: Un 10 3 = Un 10 4 = Un 10 5 = Un 10 6 = Un 10 7 = Un 10 8 = Un 10 9 = Tag: 10 10 = Tag: 10 В баше это вообще реально? Или лучше использовать PHP, perl? Если что, в программировании я 0 :) Вставить ник Quote
vlad11 Posted February 23, 2018 Posted February 23, 2018 На баше это реально. Не забудьте только VCS использовать и поделиться с обществом кодом на github'e. Вставить ник Quote
alibek Posted February 24, 2018 Posted February 24, 2018 На баше много чего реально. Но я бы использовал Perl. И скрипт получится проще, и не будет проблемы подключить библиотеку и сделать что-то более сложное. Вставить ник Quote
XuHT Posted February 26, 2018 Author Posted February 26, 2018 Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько.. Может есть скрипт на php? Вставить ник Quote
GrandPr1de Posted February 26, 2018 Posted February 26, 2018 в инернете же куча инфы как считается хекс для вланов, ну у меня живых примеров нету, а по моему коду вы нихера не поймете ибо там своя логика Вставить ник Quote
zhenya` Posted February 27, 2018 Posted February 27, 2018 http://xcme.blogspot.ru/2014/10/vlan-snmp.html Вставить ник Quote
ichthyandr Posted February 27, 2018 Posted February 27, 2018 20 часов назад, XuHT сказал: Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько.. Может есть скрипт на php? можно стягивать по telnet/ssh и парсить текст, правда представление разное на разных коммутаторах Вставить ник Quote
bos9 Posted February 28, 2018 Posted February 28, 2018 В 24.02.2018 в 02:15, XuHT сказал: В принципе не сложно скриптом перевести в бинарник, отсеяв лишние нули Но как это потом сопоставить с номерами портов? Необходимо вывести информацию в виде (ну или примерно так) Заполняете массив разрядами получившегося bin (например, как строку по-символьно). Имя массива соответствует номеру влана (для удобства), элементы массива это номера портов, ну и 0/1 в зависимости от членства в влане. Вставить ник Quote
XuHT Posted February 28, 2018 Author Posted February 28, 2018 Кое что получилось, но столкнулся с нюансом. При конвертировании в хекса в бинарник, обрезаются первые нули. Соответственно нумерация портов начинается со сдвигом. К примеру. Свитч возвращает Hex-STRING: 0F C0 00 00 00 00 00 00, вырезаю с помощью awk нужные 0FC00000, подставляю для перевода через bc (самый простой вариант) echo "obase=2; ibase=16; 0FC00000" | bc Получаю 1111110000000000000000000000 Первых 4 нулей у меня нет. Соответственно, первые четыре порта пропущены. В итоге нумерация портов начинается с 1 :( VLAN 777 is tagged on port 1 VLAN 777 is tagged on port 2 VLAN 777 is tagged on port 3 VLAN 777 is tagged on port 4 А по факту VID : 777 Member Ports : 5-8 Как конвертнуть в бинарник без обрезания нулей? :) Вставить ник Quote
pppoetest Posted February 28, 2018 Posted February 28, 2018 Я бы всё же не заморачивался на баш, а сделал на перле. Вставить ник Quote
MATPOC Posted March 1, 2018 Posted March 1, 2018 (edited) 10 часов назад, XuHT сказал: Свитч возвращает Hex-STRING: 0F C0 00 00 00 00 00 00 Такие вещи, действительно, проще делать на перле. Или питоне. Или другом языке высокого уровня, где есть развитые средства работы со строками. В шестнадцатеричной цифре 16 значений, один раз строите хэш (словарь), где каждому значению соответствует текстовая строка нулей и единиц. И потом для каждой цифры получаете значение. Например, первые четыре цифры из вашего примера: 0 - 0000 F - 1111 C - 1100 0 - 0000 Edited March 1, 2018 by MATPOC Вставить ник Quote
XuHT Posted March 1, 2018 Author Posted March 1, 2018 Решил свою проблему. Я bc скармливаю дополнительные FF, а после вывода обрезаю первые 8 символов. echo "ibase=16; obase=2; FF$var" | bc | cut -c 9- Как это называется в программировании? - костыли? ) Вставить ник Quote
XuHT Posted March 2, 2018 Author Posted March 2, 2018 (edited) d Edited March 4, 2018 by XuHT deleted Вставить ник Quote
XuHT Posted March 13, 2018 Author Posted March 13, 2018 (edited) Ну вроде как, почти доделал скрипт Получилось как то так. +---------------------------------------+ | DES-3200-10/C1 Fast Ethernet Switch | +---------------------------------------+ |PORT NUM | PVID | +=======================================+ | Tagged vlan | +---------------------------------------+ |1 | 3 666 777 | |2 | 3 666 777 | |3 | 777 | |4 | 777 | |6 | 777 | |7 | 777 | |8 | 777 | |9 | 666 777 888 999 | +---------------------------------------+ | Unagged vlan | +---------------------------------------+ |1 | 666 | |2 | 666 | |3 | 777 | |4 | 777 | |6 | 777 | |7 | 777 | |8 | 777 | +---------------------------------------+ Единственное, пока не могу придумать, как вывести одну таблицу - порт и вллан как таггед, так и антаггед. Например: +---------------------------------------+ |1 | T: 3 777 U: 666 | |2 | T: 3 777 U: 666 | |3 | U: 777 | |4 | U: 777 | |6 | U: 777 | |7 | U: 777 | |8 | U: 777 | |9 | T: 666 777 888 999 | +---------------------------------------+ У меня в скрипте, номер порта это массив. Как можно сравнить массивы в цикле между собой? Если сравнивать по отдельности каждый массив, типо вот так: if [[ "${#tagged_port[1]}" == "${#untagged_port[1]}" ]] then echo U: "${untagged_port[1]}" else [[ "${tagged_port[1]}" != "${untagged_port[1]}" ]] echo T: "${tagged_port[1]}" | sed 's/'"${untagged_port[1]}"'//g' echo U: "${untagged_port[1]}" fi То все ок, и отображает T: 3 777 U: 666 Edited March 13, 2018 by XuHT Вставить ник Quote
XuHT Posted March 17, 2018 Author Posted March 17, 2018 Выкладываю на все общее обозрение https://gitlab.com/0x2cafe/get_vlan/blob/ead3face8e9b22c0f9eb44f32bdc98a511dad00f/get_vlan.sh Есть небольшая недоработка - когда на одном порту может отобразить влан с тегом и без тега. Вставить ник Quote
Saiko Posted April 24, 2018 Posted April 24, 2018 Думаю вы не учли часть конфига (normal, fixed, forbidden), а именно (для zyxel GS-4012F): vlan xxx name blablabla normal "" fixed "" forbidden 1-12 untagged 1-12 inactive Dlink-ов нету, но думаю там что-то похожее. Надо еще фильтр по разрешенным и запрещенным на порту вланам делать. То есть еще tag/untag фильтровать по fixed, forbidden. Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.