Каждый день взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки.В принципе ничего сложного, но хотелось как то упросить себе работу.
Освоил expect и сразу в бой. Написал, опробовал, получилось. Теперь делюсь с Вами, может кому и пригодится.
Сначала создадим пустой файлик: nano ./get_mac.sh
Теперь нужно вставить внутрь туда код который ниже:
Теперь рассмотрим как это работает.
В командной строке нужно написать вызов скрипта ,ip Вашего свитча, и порт на котором хотим поглядеть МАС: ./get_mac.sh 10.5.0.10 1
После чего пройдет выполнение скрипта. Експект проанализирует входное значение. В зависимости от приветствия будет выполняться нужный сегмент кода.
У свитчей Huawei есть особенность. Можно считать таблицу fdb динамически и сортировать по содержащемуся значению. По этому для этих свитчей рекомендуется более точно указывать параметр порта. К примеру Eth0/0/Номер порта или 0/0/Номер порта. Иначе скрипт вывалит все маки в которых содержится переменная и скрипт может вылететь по причине ожидания.
Данный скрипт проверен на железках huawei s2326TP-EI, dlink des-3028, linksys sr224g4 и extreme summit 200-24. По идее будет работать и на dlink'ах других серий таких как 32,35 и cisco.
Освоил expect и сразу в бой. Написал, опробовал, получилось. Теперь делюсь с Вами, может кому и пригодится.
Сначала создадим пустой файлик: nano ./get_mac.sh
Теперь нужно вставить внутрь туда код который ниже:
#!/usr/bin/expect -f
if {[llength $argv] != 2} {
puts "Неверно указаны переменные: ./get_mac 10.5.X.XXX 'port'"
exit 1
}
set ip [lindex $argv 0]
set eth [lindex $argv 1]
set login "ЛОГИН НА СВИТЧЕ"
set pass "ПАРОЛЬ"
package require Expect
spawn telnet $ip
expect {
"*assw*" {
send "$pass\n"
expect "*>"
send "su\n"
expect "*ass*"
send "$pass\n"
expect "*>"
send "disp mac-addr dy | inc $eth\n"
expect "*>"
send "q\n"}
"*User Name*" {
send "$login\n"
expect "*asswor*"
send "$pass\n"
expect "*#"
send "show brid address-table ethernet e$eth\n"
expect "*#"
send "exit\n"}
"*login*" {
send "admin\n"
expect "*password*"
send "$pass\n"
expect "*#*"
send "show fdb port $eth\n"
expect "*#*"
send "exit\n"}
"*Name*" {
send "$login\n"
expect "*Word*"
send "$pass\n"
expect "*#"
send "show fdb port $eth\n"
expect "*#"
send "logo\n"}
}
interact
Теперь рассмотрим как это работает.
В командной строке нужно написать вызов скрипта ,ip Вашего свитча, и порт на котором хотим поглядеть МАС: ./get_mac.sh 10.5.0.10 1
После чего пройдет выполнение скрипта. Експект проанализирует входное значение. В зависимости от приветствия будет выполняться нужный сегмент кода.
У свитчей Huawei есть особенность. Можно считать таблицу fdb динамически и сортировать по содержащемуся значению. По этому для этих свитчей рекомендуется более точно указывать параметр порта. К примеру Eth0/0/Номер порта или 0/0/Номер порта. Иначе скрипт вывалит все маки в которых содержится переменная и скрипт может вылететь по причине ожидания.
Данный скрипт проверен на железках huawei s2326TP-EI, dlink des-3028, linksys sr224g4 и extreme summit 200-24. По идее будет работать и на dlink'ах других серий таких как 32,35 и cisco.
Комментарии (14)
retspen
27.11.2015 21:24Лет 5 назад писал систему для себя по управлению свитчам EDGE core, если не ошибаюсь то взять через snmpget напрямую MAC с порта нельзя только через smpwalk. Ключ для snmpwalk: ".1.3.6.1.2.1.17.4.3.1.1". Вот сам код github.com/retspen/swmon/blob/master/mac.php#L160 как оно работает я уже не помню код написан в стиле проще некуда так что можно разобраться.
FomkaV
01.12.2015 12:28Я когда искал, что то по автоматизации ssh, Expect — тоже приглянулся. Но затем, я нашел paramiko. Ниже пример для Mikrotik.
#!/usr/bin/python import paramiko ssh=paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("host",username="login",password="passwd") stdin, stdout, stderr = ssh.exec_command("/ip arp print ") result = stdout.read() print result
evg_krsk
01.12.2015 13:15Мне понравилось использовать pssh — заодно можно и массово управлять/запрашивать. На RoS 6.x и цисках вроде без проблем.
nightfly
Очень мило. Но почему-то возникает только три вопроса:
1. SNMP придумали трусы?
2. Почему на всех свитчах используются одинаковые данные для авторизации?
3. Почему «взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки»?
icCE
Ну подождите, не так быстро. Человек только expect освоил. Остальное на подходе.
Anton_Shevtsov
а как глянуть через snmp? я snmp браузером полазил по своим hp — не нашёл. но признаю, что поверхностно искал.
icCE
Может поможет
habrahabr.ru/post/128439
artemlight
ууу жесть какая.
Я длинки одним макросом опрашиваю, например
icCE
Я дал как пример, что бы было от чего оттолкнуться. Да и Zabbix умеет уже намного больше. Вообще конечно, правильно сварганить web морду и отдать support, что бы они тебе на могзи меньше капали. Админы должны смотреть котиков и пить чай ;) кофе/пиво.
karabanov
Видимо вы хотели сказать «snmpwalk -v2c -c public IP_АДРЕС_СВИТЧА»
karabanov
Удалось вычитать с Juniper, EdgeCore, D-Link, а Cisco пошла по своему пути и так вычитывать MAC-адреса не позволяет, но есть костыль описаный здесь habrahabr.ru/post/213247
nightfly
Смотрите .1.3.6.1.2.1.17.4.3.1.2 или .1.3.6.1.2.1.17.7.1.2.2.1.2
Emiresk
1. SNMP придумали трусы?
Не трусы, но пока пишется система на php которая снимит мак по SNMP, это решение подошло очень кстати.
2. Почему на всех свитчах используются одинаковые данные для авторизации?
К сожалению так сложилось исторически на провайдере где я работаю. И высшее руководство такой метод авторизации вполне устраивает.
3. Почему «взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки»?
У саппорта нет доступа к оборудованию. А от старого админа осталось так сказать мало информации. К примеру в каком порту абонент. Приходится искать.
А вообще когда я искал подобные скрипты, не нашел ничего подобного.