说一下思路吧:
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的交换机,最终定位到终端所连的交换机的接口。
(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):
#
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")
(0)
能否给一份脚本
亲~登录后才可以操作哦!
确定你的邮箱还未认证,请认证邮箱或绑定手机后进行当前操作
举报
×
侵犯我的权益
×
侵犯了我企业的权益
×
抄袭了我的内容
×
原文链接或出处
诽谤我
×
对根叔社区有害的内容
×
不规范转载
×
举报说明
能否给一份脚本