Пользователь
0,0
рейтинг
27 ноября 2015 в 16:46

Администрирование → Удобый просмотр MAC адресов на портах свитчей huawei, linksys, dlink, extreme при помощи expect из песочницы

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

Освоил 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.
@Emiresk
карма
4,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (14)

  • +4
    Очень мило. Но почему-то возникает только три вопроса:

    1. SNMP придумали трусы?
    2. Почему на всех свитчах используются одинаковые данные для авторизации?
    3. Почему «взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки»?
    • +6
      Ну подождите, не так быстро. Человек только expect освоил. Остальное на подходе.
    • 0
      а как глянуть через snmp? я snmp браузером полазил по своим hp — не нашёл. но признаю, что поверхностно искал.
      • 0
        Может поможет

        habrahabr.ru/post/128439
        • 0
          ууу жесть какая.

          Я длинки одним макросом опрашиваю, например

          snmpwalk -v2c -c public MAC_АДРЕС_СВИТЧА 1.3.6.1.2.1.17.7.1.2.2.1.2 | sed "s/\./ /g" | sed "s/SNMPv2-SMI::mib-2 17 7 1 2 2 1 2 //g" | sed "s/ = INTEGER://g"  | awk '{printf "%02X%02X%02X%02X%02X%02X %s Ethernet%s \n",$2,$3,$4,$5,$6,$7,$1,$8}' 
          
          • 0
            Я дал как пример, что бы было от чего оттолкнуться. Да и Zabbix умеет уже намного больше. Вообще конечно, правильно сварганить web морду и отдать support, что бы они тебе на могзи меньше капали. Админы должны смотреть котиков и пить чай ;) кофе/пиво.
          • 0
            Видимо вы хотели сказать «snmpwalk -v2c -c public IP_АДРЕС_СВИТЧА»
          • 0
            Удалось вычитать с Juniper, EdgeCore, D-Link, а Cisco пошла по своему пути и так вычитывать MAC-адреса не позволяет, но есть костыль описаный здесь habrahabr.ru/post/213247
      • 0
        Смотрите .1.3.6.1.2.1.17.4.3.1.2 или .1.3.6.1.2.1.17.7.1.2.2.1.2
    • 0
      1. SNMP придумали трусы?
      Не трусы, но пока пишется система на php которая снимит мак по SNMP, это решение подошло очень кстати.

      2. Почему на всех свитчах используются одинаковые данные для авторизации?
      К сожалению так сложилось исторически на провайдере где я работаю. И высшее руководство такой метод авторизации вполне устраивает.

      3. Почему «взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки»?
      У саппорта нет доступа к оборудованию. А от старого админа осталось так сказать мало информации. К примеру в каком порту абонент. Приходится искать.

      А вообще когда я искал подобные скрипты, не нашел ничего подобного.
  • 0
    Лет 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 как оно работает я уже не помню код написан в стиле проще некуда так что можно разобраться.
  • +2
    а у нас как то вот так
    image
    оч.удобно, сразу все видно
  • 0
    Я когда искал, что то по автоматизации 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
    
    • 0
      Мне понравилось использовать pssh — заодно можно и массово управлять/запрашивать. На RoS 6.x и цисках вроде без проблем.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.