XuHT Опубликовано 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 :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
vlad11 Опубликовано 23 февраля, 2018 · Жалоба На баше это реально. Не забудьте только VCS использовать и поделиться с обществом кодом на github'e. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 24 февраля, 2018 · Жалоба На баше много чего реально. Но я бы использовал Perl. И скрипт получится проще, и не будет проблемы подключить библиотеку и сделать что-то более сложное. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 26 февраля, 2018 · Жалоба Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько.. Может есть скрипт на php? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
GrandPr1de Опубликовано 26 февраля, 2018 · Жалоба в инернете же куча инфы как считается хекс для вланов, ну у меня живых примеров нету, а по моему коду вы нихера не поймете ибо там своя логика Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zhenya` Опубликовано 27 февраля, 2018 · Жалоба http://xcme.blogspot.ru/2014/10/vlan-snmp.html Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ichthyandr Опубликовано 27 февраля, 2018 · Жалоба 20 часов назад, XuHT сказал: Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько.. Может есть скрипт на php? можно стягивать по telnet/ssh и парсить текст, правда представление разное на разных коммутаторах Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
bos9 Опубликовано 28 февраля, 2018 · Жалоба В 24.02.2018 в 02:15, XuHT сказал: В принципе не сложно скриптом перевести в бинарник, отсеяв лишние нули Но как это потом сопоставить с номерами портов? Необходимо вывести информацию в виде (ну или примерно так) Заполняете массив разрядами получившегося bin (например, как строку по-символьно). Имя массива соответствует номеру влана (для удобства), элементы массива это номера портов, ну и 0/1 в зависимости от членства в влане. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 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 Как конвертнуть в бинарник без обрезания нулей? :) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
pppoetest Опубликовано 28 февраля, 2018 · Жалоба Я бы всё же не заморачивался на баш, а сделал на перле. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
MATPOC Опубликовано 1 марта, 2018 (изменено) · Жалоба 10 часов назад, XuHT сказал: Свитч возвращает Hex-STRING: 0F C0 00 00 00 00 00 00 Такие вещи, действительно, проще делать на перле. Или питоне. Или другом языке высокого уровня, где есть развитые средства работы со строками. В шестнадцатеричной цифре 16 значений, один раз строите хэш (словарь), где каждому значению соответствует текстовая строка нулей и единиц. И потом для каждой цифры получаете значение. Например, первые четыре цифры из вашего примера: 0 - 0000 F - 1111 C - 1100 0 - 0000 Изменено 1 марта, 2018 пользователем MATPOC Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 1 марта, 2018 · Жалоба Решил свою проблему. Я bc скармливаю дополнительные FF, а после вывода обрезаю первые 8 символов. echo "ibase=16; obase=2; FF$var" | bc | cut -c 9- Как это называется в программировании? - костыли? ) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 2 марта, 2018 (изменено) · Жалоба d Изменено 4 марта, 2018 пользователем XuHT deleted Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 13 марта, 2018 (изменено) · Жалоба Ну вроде как, почти доделал скрипт Получилось как то так. +---------------------------------------+ | 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 Изменено 13 марта, 2018 пользователем XuHT Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
XuHT Опубликовано 17 марта, 2018 · Жалоба Выкладываю на все общее обозрение https://gitlab.com/0x2cafe/get_vlan/blob/ead3face8e9b22c0f9eb44f32bdc98a511dad00f/get_vlan.sh Есть небольшая недоработка - когда на одном порту может отобразить влан с тегом и без тега. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Saiko Опубликовано 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. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...