рдореИрдХ рдкрддреЗ рдкрд░ рдЦреЛрдЬ рдЬреБрдирд┐рдкрд░ рд╕реНрд╡рд┐рдЪ

рд╕реНрдерд╛рдиреАрдп рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореИрдХ рдкрддрд╛ рд╕реНрд╡рд┐рдЪ рдХреЗ рдХрд┐рд╕ рдкреЛрд░реНрдЯ рдкрд░ рд╕реНрдерд┐рдд рд╣реИред рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ рдХрдИ рд╕реНрд╡рд┐рдЪ рд╣реЛрдиреЗ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ 30 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкрд╛рдпрдерди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╡рд╛рдВрдЫрд┐рдд рдореИрдХ рдкрддреЗ рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рд╕реНрд╡рд┐рдЪ рдХрд╛ рдирд╛рдо рдФрд░ рдкреЛрд░реНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдореИрдХ рдкрдВрдЬреАрдХреГрдд рд╣реИред



рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред рдХрдЯ рдХреЗ рддрд╣рдд рд╡рд┐рд╡рд░рдгред

рдпрджрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН , CORE рд░реВрдЯ рд╕реНрд╡рд┐рдЪ, рдЬрд┐рд╕рд╕реЗ DS (рд╡рд┐рддрд░рдг рд╕реНрд╡рд┐рдЪ) рд╡рд┐рддрд░рдг рд╕реНрд╡рд┐рдЪ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ, рдФрд░ рдЙрдирд╕реЗ, рдмрджрд▓реЗ рдореЗрдВ, рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ AS (рдПрдХреНрд╕реЗрд╕ рд╕реНрд╡рд┐рдЪ) рд╕реНрд╡рд┐рдЪред рдпрд╣ рдирд┐рдпрдо рд╣рдореЗрд╢рд╛ рд╕рд╣реА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ; рдПрдХреНрд╕реЗрд╕ рд╕реНрд╡рд┐рдЪ рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрдкрд╕реНрдЯреНрд░реАрдо рд╕реНрд╡рд┐рдЪ рдкреЛрд░реНрдЯ рдореЗрдВ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЬреБрдбрд╝реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рднреА рдореИрдХ рдкрддреЗ рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреА рдбрд┐рд╡рд╛рдЗрд╕ AS3 рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИ, рддреЛ, CORE рдХреЗ рд╕рд╛рде рдЦреЛрдЬ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЗрд╕ рдкрддреЗ рдХреЛ DS1 рдХреА рдУрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯ рдкрд░ рдкрд╛рдПрдВрдЧреЗред DS1 рдкрд░ рдЬрд╛рдиреЗ рдкрд░ , рд╣рдо AS2 рдХреА рдУрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд░реНрдЯ рдкрд░ рдЗрд╕ MAC рдХреЛ рдкрд╛рдПрдВрдЧреЗ, AS2 рдкрд░ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рд╣рдореЗрдВ AS3 рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ AS3 рдкрд░ рд╣рдореЗрдВ рд╡рд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреЛрд░реНрдЯ рдорд┐рд▓реЗрдЧрд╛, рдЬрд┐рд╕ рдкрд░ рдмреНрдпрд╛рдЬ рдХрд╛ рдЙрдкрдХрд░рдг рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред

рдореИрдВ рдпрд╣ рд╕рдм рд╣рд╛рде рд╕реЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдПрдХ рд▓реВрдк рдореЗрдВ рд╕рднреА рд╕реНрд╡рд┐рдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЙрд░реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдкрд▓рд┐рдВрдХ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ рдХрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд▓рд╛ рд╕рдорд╛рдзрд╛рди рдкреИрджрд╛ рд╣реБрдЖ, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдПрдХ рдмрд┐рдЯред


рдореИрдХ 08: 62: 66: c7: b3: 45 рдХреЛ рдЬреБрдирд┐рдкрд░ рд╕реНрд╡рд┐рдЪ рдкрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБ:

show ethernet-switching table | match 08:62:66:c7:b3:45 

рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдореИрдХ рд╣реИ, рддреЛ рдЙрддреНрддрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛:

 vlan151 08:62:66:c7:b3:45 D - xe-0/0/23.0 

рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рдЙрд╕ рд╕реНрд╡рд┐рдЪ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рдирд╛рдо рд╣реЛрдЧрд╛ рдЬрд┐рд╕ рдкрд░ рдореИрдХ рдкрдВрдЬреАрдХреГрдд рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╣рд╛рдБ рдЬрд╛рддрд╛ рд╣реИ? рдФрд░ рдпрд╣рд╛рдБ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рд╡рд░рдг рдмрдЪрд╛рд╡ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред рдпреЗ рд╕реНрд╡рд┐рдЪ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд╛рдЗрдиреЗрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдЯреЗрдХреНрд╕реНрдЯ рд▓реЗрдмрд▓ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред

рдЯреАрдо

 show interfaces xe-0/0/23 descriptions 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд┐рдЦрд╛рдПрдЧрд╛:

 Interface Admin Link Description xe-0/0/23 up up SW>DS1 

рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ, рд╣рдо рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдбрд╛рдЙрдирд╕реНрдЯреНрд░реАрдо рд╕реНрд╡рд┐рдЪ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ:

 set interfaces xe-0/0/23 description SW>DS1 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░реЗрдЧреА:

  1. SSH рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рд╕реНрд╡рд┐рдЪ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
  2. рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдореИрдХ рдПрдбреНрд░реЗрд╕ рдХрд┐рд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ;
  3. рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рджреЗрдЦреЗрдВ;
  4. рдпрджрд┐ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрд╡рд┐рдЪ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдЧрд▓реЗ рд╕реНрд╡рд┐рдЪ рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВред

 #       searchpass = [] #main      MAC-    checkswitch,           MAC-.       searchpass   json. def main(argv): mac_addr = argv[0] checkswitch('CORE',mac_addr) for switch in searchpass: print (json.dumps(switch, ensure_ascii=False)) if __name__ == "__main__": main(sys.argv[1:]) #   MAC- def checkswitch(hostname,mac_addr): try: #    ,  host    returnvalue = {} returnvalue['host']=hostname #sendCommand      SSH     MAC-    answer = sendCommand(hostname,'show ethernet-switching table | match '+mac_addr) #   ,      #vlan151 08:62:66:c7:b3:45 D - xe-0/0/23.0 if(answer!=0): iface = answer.split()[4] returnvalue['iface']=iface # description ,    2  .0       #xe-0/0/23 up up SW>DS01 answer = sendCommand(hostname,'show interfaces '+iface[:-2]+' descriptions | last 1 | no-more') iface = answer.split() # description   ,      ,     SW>.  ,   3 ,         . if(len(iface)>2): iface=iface[3] returnvalue['description']=iface else: returnvalue['description']='none' searchpass.append(returnvalue) if (iface[:3]=='SW>'): checkswitch(iface[3:],mac_addr) else: returnvalue['iface']='none' searchpass.append(returnvalue) except Exception as e: print(e) 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд░реНрдиреЗрд▓ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрд╡рд┐рдЪ рд╕реЗ рдЧреБрдЬрд░ рдЬрд╛рдПрдЧреА, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдореИрдХ рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧреАред рд╕рдлрд▓ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрдЬ рддрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░ рд╡рд┐рд╡рд░рдг рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рдЯреЛрдкреЛрд▓реЙрдЬреА рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рдЬрдЯрд┐рд▓рддрд╛ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:

 python findmac.py 00:17:fc:21:e8:f9 {"host": "CORE", "iface": "xe-0/0/23.0", "description": "SW>DS1"} {"host": "DS1", "iface": "xe-0/0/11.0", "description": "SW>AS2"} {"host": "AS2", "iface": "xe-1/0/1.0", "description": "SW>AS3"} {"host": "AS3", "iface": "ge-0/0/26.0", "description": "none"} 

рдпрджрд┐ рдХреЛрдИ рдореИрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ

 {"host": "CORE", "iface": "none"} 

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рд╕реНрд╡рд┐рдЪ рдФрд░ рдкреЛрд░реНрдЯ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рд░реБрдЪрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╣рдо рд╕рдВрдкреВрд░реНрдг рдЦреЛрдЬ рдкрде рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рдкреВрд░реНрдг рдХреЛрдб рд╣реИ, рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

findmac.py
 import paramiko import time import sys import json import threading import logging login = 'user1' password = 'pass1234' searchpass = [] port = 22 class LogPipe(threading.Thread): def __init__(self, level): threading.Thread.__init__(self) self.daemon = False self.level = level self.fdRead, self.fdWrite = os.pipe() self.pipeReader = os.fdopen(self.fdRead) self.start() def fileno(self): return self.fdWrite def run(self): for line in iter(self.pipeReader.readline, ''): logging.log(self.level, line.strip('\n')) self.pipeReader.close() def close(self): os.close(self.fdWrite) def execute_ssh_command(host, port, username, password, command): try: # Create the SSH client. ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Connect to the host. ssh.connect(host, port, username, password, look_for_keys=False) # Send the command (non-blocking) stdin, stdout, stderr = ssh.exec_command(command) # Wait for the command to terminate while not stdout.channel.exit_status_ready() and not stdout.channel.recv_ready(): time.sleep(1) stdoutstring = stdout.readlines() stderrstring = stderr.readlines() return stdoutstring, stderrstring finally: if ssh is not None: # Close client connection. ssh.close() def sendCommand (hostname,command): returnvalue = 0 logging.info('Host '+hostname+', command: '+command) Try: #add .mydomain for FQDN (stdoutstring, stderrstring) = execute_ssh_command(hostname+'.mydomain', port, login, password, command+'\n') if (len(stdoutstring)>0): logging.info(stdoutstring[0]) if (len(stderrstring)>0): logging.info(stderrstring[0]) except Exception as e: return returnvalue else: returnvalue = stdoutstring[0] finally: return returnvalue def checkswitch(hostname,mac_addr): try: returnvalue = {} returnvalue['host']=hostname answer = sendCommand(hostname,'show ethernet-switching table | match '+mac_addr) if(answer!=0): iface = answer.split()[4] returnvalue['iface']=iface #cut .0 prefix in the interface name answer = sendCommand(hostname,'show interfaces '+iface[:-2]+' descriptions | last 1 | no-more') iface = answer.split() if(len(iface)>2): iface=iface[3] returnvalue['description']=iface else: returnvalue['description']='none' searchpass.append(returnvalue) if (iface[:3]=='SW>'): checkswitch(iface[3:],mac_addr) else: returnvalue['iface']='none' searchpass.append(returnvalue) except Exception as e: logging.info(e) def main(argv): mac_addr = argv[0] #configure log logging.basicConfig(filename='/var/log/findmac.log', level=logging.INFO, format='%(asctime)s %(message)s') logging.info('Find MAC: '+mac_addr) checkswitch('CORE',mac_addr) for switch in searchpass: print (json.dumps(switch, ensure_ascii=False)) if __name__ == "__main__": main(sys.argv[1:]) 

Source: https://habr.com/ru/post/hi420013/


All Articles