• 全部
  • 经验案例
  • 典型配置
  • 技术公告
  • FAQ
  • 漏洞说明
  • 全部
  • 全部
  • 大数据引擎
  • 知了引擎
产品线
搜索
取消
案例类型
发布者
是否解决
是否官方
时间
搜索引擎
匹配模式
高级搜索

如何利用python定位某个mac所在的交换机的端口以及其vlan id

2020-03-25提问
  • 0关注
  • 1收藏,1936浏览
粉丝:7人 关注:0人

问题描述:

说一下思路吧:

1,所有接入交换机必须开启ssh,并做成excel表格,格式如下:交换机命名:sysname,管理ip:hostname,port:22,密码:password

2,利用python读取excel中的数据,循环ssh登陆每台交换机下发display mac-address命令,并将结果保存在D盘目录下,格式为hostname(sysname).txt。

3,再定义一个search_mac(mac_address)函数,打开上面保存的txt,读取每一行,然后写循环,判断这个mac_address如果在这行中,下面进行正则表达式匹配,一个是mac_re,另一个是vlan_re,最后print打印“这个mac_address在交换机hostname的xx端口上,且vlan id为xx”

4,这个定位的mac_address肯定会显示这些设备上,终端交换机---级联交换机---网关设备---级联交换机所在的接口,交换机互联的trunk口一般都是最后几个口,根据上面的打印信息,你就可以排除trunk口学习该mac_address的交换机,最终定位到终端所连的交换机的接口。

最佳答案

粉丝:7人 关注:0人

网关设备有该mac,级联交换机trunk放通该vlan的接口也会学习到这个mac,连接该mac的交换机access口也会学习这个mac,这是display mac-address命令无法解决的原因导致的。

这个需求python脚本已经写好,测试正常:

*****************192.168.124.100****************** 

正在连接主机192.168.124.100...... 

连接主机192.168.124.100成功! 

8e88-069b-0406 在交换机192.168.124.100(SW1)的GE1/0/1端口上!该mac地址的vlan id为 20 

*****************192.168.124.101****************** 

正在连接主机192.168.124.101...... 

连接主机192.168.124.101成功! 

8e88-069b-0406 在交换机192.168.124.101(SW2)的GE1/0/2端口上!该mac地址的vlan id为 20 

*****************192.168.124.102****************** 

正在连接主机192.168.124.102...... 

连接主机192.168.124.102成功! 

8e88-069b-0406 在交换机192.168.124.102(SW3)的GE1/0/3端口上!该mac地址的vlan id为 20 

Process finished with exit code 0


excel表格如下:

代码如下:

from paramiko.ssh_exception import NoValidConnectionsError
from paramiko.ssh_exception import AuthenticationException
import openpyxl as xl
import re


def connect_ssh(cmd, hostname, port=22, username="", passwd=""):
   
import paramiko

   
# 1.创建一个ssh对象
   
client = paramiko.SSHClient()

   
# 2.解决问题:如果之前没有,连接过的ip,会出现选择yes或者no的操作,
   
# 自动选择yes
   
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
   
# 3.连接服务器
   
try:
        client.connect(
hostname=hostname,
                      
port=port,
                      
username=username,
                      
password=passwd
                       )
       
print("正在连接主机%s......" % hostname)
       
print("连接主机%s成功!" % hostname)

   
except NoValidConnectionsError as e:  # 用户不存在时的报错
       
print("连接失败")
   
except AuthenticationException as t:  # 密码错误的报错
       
print("密码错误")

   
else:
        
# 4.执行操作
       
stdin, stdout, stderr = client.exec_command(cmd)
       
# 5.获取命令执行的结果
       
result = stdout.read().decode("utf-8")
       
# print(result)

        # 6.
D盘创建以主机ip为命名的txt文本,将result的结果写进{hostname}.txt记事本
       
with open("D:\\%s(%s).txt" % (hostname, sysname), "w") as ssh_result:
            ssh_result.write(result)

       
# 7.关闭连接
   
finally:
        client.close()


wb = xl.load_workbook(
"transactions3.xlsx")  # 加载远程登录的excel文档
sheet = wb["Sheet1"]
for row in range(2, sheet.max_row + 1):  # 行数范围从2max_row
   
cell_1 = sheet.cell(row, 1)  # 定义单元格
       
sysname = cell_1.value
    cell_2 = sheet.cell(row
, 2)
    hostname = cell_2.value
    cell_3 = sheet.cell(row
, 3)
    port = cell_3.value
    cell_4 = sheet.cell(row
, 4)
    username = cell_4.value
    cell_5 = sheet.cell(row
, 5)
    passwd = cell_5.value
   
print(hostname.center(50, "*"))
    commands = [
"dis mac-address"]  # 定义ssh登录操作的指令列表
   
# sshThreads = []  进程列表
   
for command in commands:
        connect_ssh(command
, hostname, port, username, passwd)  # 利用for循环,循环操作commands列表中的动作



 
def search_mac(mac_address):
       
with open("D:\\%s(%s).txt" % (hostname, sysname)) as ssh_result:
            lines = ssh_result.readlines()
       
for line in lines:
           
if mac_address.lower() in line:
                mac_re = re.compile(
r"(GE|XGE|FGE|HGE)(\d/){2,4}(\d)+")
                vlan_re = re.compile(
r"(\s+)(\d{1,4})(\s+)")
                port_id = mac_re.search(line)
                vlan_id = vlan_re.search(line)
               
print("%s 在交换机%s(%s)%s端口上!mac地址的vlan id %s" % (mac_address.lower(), hostname, sysname,
                                                                 
port_id.group(), vlan_id.group(2)))


    search_mac(
mac_address="8e88-069b-0406")



 





能否给一份脚本

一页书 发表时间:2020-07-19
1 个回答
粉丝:4人 关注:1人

同问,坐等大神回答。不知道mib行不行

编辑答案

你正在编辑答案

如果你要对问题或其他回答进行点评或询问,请使用评论功能。

分享扩散:

提出建议

    +

亲~登录后才可以操作哦!

确定

亲~检测到您登陆的账号未在http://hclhub.h3c.com进行注册

注册后可访问此模块

跳转hclhub

你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作

举报

×

侵犯我的权益 >
对根叔社区有害的内容 >
辱骂、歧视、挑衅等(不友善)

侵犯我的权益

×

泄露了我的隐私 >
侵犯了我企业的权益 >
抄袭了我的内容 >
诽谤我 >
辱骂、歧视、挑衅等(不友善)
骚扰我

泄露了我的隐私

×

您好,当您发现根叔知了上有泄漏您隐私的内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到pub.zhiliao@h3c.com 邮箱,我们会尽快处理。
  • 1. 您认为哪些内容泄露了您的隐私?(请在邮件中列出您举报的内容、链接地址,并给出简短的说明)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)

侵犯了我企业的权益

×

您好,当您发现根叔知了上有关于您企业的造谣与诽谤、商业侵权等内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到 pub.zhiliao@h3c.com 邮箱,我们会在审核后尽快给您答复。
  • 1. 您举报的内容是什么?(请在邮件中列出您举报的内容和链接地址)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)
  • 3. 是哪家企业?(营业执照,单位登记证明等证件)
  • 4. 您与该企业的关系是?(您是企业法人或被授权人,需提供企业委托授权书)
我们认为知名企业应该坦然接受公众讨论,对于答案中不准确的部分,我们欢迎您以正式或非正式身份在根叔知了上进行澄清。

抄袭了我的内容

×

原文链接或出处

诽谤我

×

您好,当您发现根叔知了上有诽谤您的内容时,您可以向根叔知了进行举报。 请您把以下内容通过邮件发送到pub.zhiliao@h3c.com 邮箱,我们会尽快处理。
  • 1. 您举报的内容以及侵犯了您什么权益?(请在邮件中列出您举报的内容、链接地址,并给出简短的说明)
  • 2. 您是谁?(身份证明材料,可以是身份证或护照等证件)
我们认为知名企业应该坦然接受公众讨论,对于答案中不准确的部分,我们欢迎您以正式或非正式身份在根叔知了上进行澄清。

对根叔社区有害的内容

×

垃圾广告信息
色情、暴力、血腥等违反法律法规的内容
政治敏感
不规范转载 >
辱骂、歧视、挑衅等(不友善)
骚扰我
诱导投票

不规范转载

×

举报说明