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

Освоил 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)


  1. nightfly
    27.11.2015 19:37
    +4

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

    1. SNMP придумали трусы?
    2. Почему на всех свитчах используются одинаковые данные для авторизации?
    3. Почему «взаимодействуя с тех.поддержкой приходится лазить на свитчи и глядеть маки»?


    1. icCE
      27.11.2015 20:38
      +6

      Ну подождите, не так быстро. Человек только expect освоил. Остальное на подходе.


    1. Anton_Shevtsov
      27.11.2015 20:50

      а как глянуть через snmp? я snmp браузером полазил по своим hp — не нашёл. но признаю, что поверхностно искал.


      1. icCE
        27.11.2015 22:49

        Может поможет

        habrahabr.ru/post/128439


        1. artemlight
          28.11.2015 00:05

          ууу жесть какая.

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

          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}' 
          


          1. icCE
            28.11.2015 12:14

            Я дал как пример, что бы было от чего оттолкнуться. Да и Zabbix умеет уже намного больше. Вообще конечно, правильно сварганить web морду и отдать support, что бы они тебе на могзи меньше капали. Админы должны смотреть котиков и пить чай ;) кофе/пиво.


          1. karabanov
            30.11.2015 11:25

            Видимо вы хотели сказать «snmpwalk -v2c -c public IP_АДРЕС_СВИТЧА»


          1. karabanov
            30.11.2015 11:39

            Удалось вычитать с Juniper, EdgeCore, D-Link, а Cisco пошла по своему пути и так вычитывать MAC-адреса не позволяет, но есть костыль описаный здесь habrahabr.ru/post/213247


      1. nightfly
        28.11.2015 00:51

        Смотрите .1.3.6.1.2.1.17.4.3.1.2 или .1.3.6.1.2.1.17.7.1.2.2.1.2


    1. Emiresk
      30.11.2015 11:48

      1. SNMP придумали трусы?
      Не трусы, но пока пишется система на php которая снимит мак по SNMP, это решение подошло очень кстати.

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

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

      А вообще когда я искал подобные скрипты, не нашел ничего подобного.


  1. 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 как оно работает я уже не помню код написан в стиле проще некуда так что можно разобраться.


  1. solalex
    27.11.2015 21:56
    +2

    а у нас как то вот так
    image
    оч.удобно, сразу все видно


  1. 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
    


    1. evg_krsk
      01.12.2015 13:15

      Мне понравилось использовать pssh — заодно можно и массово управлять/запрашивать. На RoS 6.x и цисках вроде без проблем.