Просмотр MAC адресов на портах свитчей Huawei, Linksys, DLink, Extreme

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

Освоил 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/Номер порта . Иначе скрипт вывалит все маки в которых содержится переменная и скрипт может вылететь