用perl实现交换机ip和mac批量绑定 2020-04-11 网络 暂无评论 2485 次阅读 上段时间已经把公司网络结构进行改造,统一换成了可以网管的S3100交换机,在对交换机配置了远程管理后,对工作效率有了很大的提高,下步就要实现交换机端口的ip和mac地址绑定,以实现更安全的管理。 由于采用了DHCP进行地址分配,已经可以获得ip和mac地址的对应关系,那么只需要在交换机上取得每个端口下的mac地址就可以了,然后就可以用perl来实现绑定操作的自动输出,下面一步一步进行说明。 1,转换mac地址格式 从交换机上取得的mac地址格式是“aaaa-bbbb-cccc”,但是DHCP那么的数据是这样的: ``` 192.168.1.10 00247E14CFE8 192.168.1.11 001AA0275EB4 ``` 所以我们的把地址格式转换成交换机可以识别的,并且字母改成小写,程序代码如下: ``` #!/usr/bin/perl -w use strict; my $filename = '/opt/switch/dhcp_data'; open FH, "< $filename" or die "can't open $filename ..... ($!)"; foreach () { if ( $_ =~ /^\s*$/ ) { next; } my $rec = lc($_); my ( $ip, $mac ) = split( / +/, $_ ); my $mac_1 = substr( $mac, 0, 4 ); my $mac_2 = substr( $mac, 4, 4 ); my $mac_3 = substr( $mac, 8, 4 ); print "$ip $mac_1-$mac_2-$mac_3\n"; } ``` 执行结果如下: ``` [root@localhost switch]# ./chang_format.pl 192.168.1.10 0024-7e14-cfe8 192.168.1.11 001a-a027-5eb4 ``` 2,转换完格式后,那么就要开始收集交换机每个端口下的mac地址信息。 交换机执行命令如下: ``` display mac-address interface Ethernet1/0/1 ....... display mac-address interface Ethernet1/0/24 ``` 最后获得的数据如下: ``` [WS-T402-A]display mac-address interface Ethernet1/0/1 No Mac address on the port! [WS-T402-A]display mac-address interface Ethernet1/0/2 MAC ADDR VLAN ID STATE PORT INDEX AGING TIME(s) 0023-ae66-7a3f 10 Learned Ethernet1/0/2 AGING --- 1 mac address(es) found on port Ethernet1/0/2 --- [WS-T402-A]display mac-address interface Ethernet1/0/3 MAC ADDR VLAN ID STATE PORT INDEX AGING TIME(s) 0023-ae6d-05cb 10 Learned Ethernet1/0/3 AGING --- 1 mac address(es) found on port Ethernet1/0/3 --- [WS-T402-A]display mac-address interface Ethernet1/0/4 No Mac address on the port! [WS-T402-A]display mac-address interface Ethernet1/0/5 MAC ADDR VLAN ID STATE PORT INDEX AGING TIME(s) 0019-d150-5353 5 Learned Ethernet1/0/5 AGING ``` 然后我们需要一个主程序来获得ip,mac,端口的信息,并实现批量绑定输出。 这个程序实现过程如下,过滤掉从交换机上获得的其他行数据,只保留含有mac地址的那一行,然后和DHCP的数据表进行比较,找出这2个文件都含有相同mac地址的信息,最后输出就可以了,代码如下: ``` #!/usr/bin/perl -w use strict; my $switch_data = '/opt/switch/switch_data'; open SD, "< $switch_data" or die "can't open $switch_data ..... ($!)"; my $ip_mac = '/opt/switch/ip_mac'; open IM, "< $ip_mac" or die "can't open $ip_mac ..... ($!)"; my @lines = ; close IM; foreach () { if ( $_ =~ /^\d/ ) { my ( $mac, $vlan, $state, $port, $agent ) = split( / +/, $_ ); #print "$mac\t $port\n"; foreach (@lines) { chomp $_; if ( $_ =~ /$mac/ ) { my ( $ip, $mac_1 ) = split( / +/, $_ ); print "interface $port\n"; print "am user-bind mac-addr $mac ip-addr $ip\n"; } } } } ``` 输出结果如下: ``` [root@localhost switch]# ./am.pl interface Ethernet1/0/5 am user-bind mac-addr 0019-d150-5353 ip-addr 192.168.1.105 interface Ethernet1/0/6 am user-bind mac-addr 001e-c954-15dc ip-addr 192.168.1.212 interface Ethernet1/0/7 am user-bind mac-addr 0013-20d0-9db9 ip-addr 192.168.1.146 ``` 剩下的工作就是在交换机上执行 am.pl 文件输出的结果就ok了。 这样就大大的较少了人工查找的时间及在交换机上绑定的误操作,以方便同事在交换机上的执行。 标签: MAC, ip 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。