2

Implementando Python en Cisco Networking

Python es un lenguaje muy poderoso también para hacer scripts que puedan facilitarnos la vida diaria, tiene un sin fin de librerías que nos facilitaran la vida, sobre todo en el mundo de los sys admin y de los administradores de redes. Se les hace conocido el dicho de "Yo me dedico al networking, de que me sirve la programación", yo lo he escuchado un sin fin de veces, de hecho me dedico a redes, seguridad, etc..., pero no me forme con esa ideología de que no es necesaria la programación, si no al contrario es un facilitador de tareas diarias, que se vuelven rutinarias y tediosas.

En esta ocasión les vengo a compartir unos scripts creados en python que nos permiten interactuar al momento de hacer troubleshooting en equipos cisco, sin tirar ningún comando dentro de los dispositivos, completamente automatizado. Para poder realizar un script automatizado para los dispositivos cisco necesitamos de una librería llamada "paramiko" de la cual pueden bajar el código fuente de: https://pypi.python.org/pypi/paramiko/

Es una libreria que nos permite realizar conexiones por medio del protocolo SSH2 en arquitectura C/S, también esta librería nos permite hacer uso seguro de los scripts por que utiliza varios métodos de encriptacion, hashes y también nos da soporte al protocolo SFTP para que si aun siguen haciendo transferencias por medio de file transfer protocol este no viaje en texto plano.

Les comparto 3 scripts en los que estoy trabajando, que inclusive en mi labro ya se han aplicado, esto consiste en lo siguiente, normalmente en troubleshooting de cisco devices, tenemos un sin fin de problemas; como red caída, reinicio de equipo, peer OSPF o BGP caído, problemas con interfaces, revisar logs, etc... Regularmente hacer la investigación lleva tiempo desde hacer el login en el equipo y escribir cada comando nos quita tiempo, pues ese script a compartir lo que hace es solo pide la dirección IP del dispositivo y el resto lo hace el script

import paramiko
import cmd
import sys
import time
import os

def conexion(ip):
	hostname = raw_input("Enter the hostname\n")
	ssh = paramiko.SSHClient()
	ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	ssh.connect(ip, username='test', password='test', allow_agent=False, look_for_keys=False)
	ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
	chan = ssh.invoke_shell()
	print "[+] Connecting........"
	print clock(chan, hostname)
	print versionUptime(chan, hostname)
	print vlan(chan, hostname)
	print spa(chan, hostname)
	print u"\x1b[0m"
	print main()

def clock(chan, hostname):
	hostname = hostname + '#'
	chan.send('show clock')
	chan.send('\n')
	time.sleep(1)
	clock = chan.recv(9999)
	if clock != hostname:
		return clock.strip(hostname)		

def versionUptime(chan, hostname):
	hostname = hostname + '#'
	chan.send('show version | i uptime')
	chan.send('\n')
	time.sleep(1)
	clock = chan.recv(9999)
	if clock != hostname:
		return clock.strip(hostname)		

def vlan(chan, hostname):
	hostname = hostname + '#'
	chan.send('show vlan brief')
	chan.send('\n')
	time.sleep(1)
	clock = chan.recv(9999)
	if clock != hostname:
		return clock.strip(hostname)	

def spa(chan, hostname):
	hostname = hostname + '#'
	chan.send('sh spanning-tree summary')
	chan.send('\n')
	time.sleep(1)
	clock = chan.recv(9999)
	if clock != hostname:
		return clock.strip(hostname)	

print ("############################################")
print ("#            osisecurite.com               #")
print ("#                by chapo                  #")
print ("#                                          #")
print ("############################################\n")

def main():
	protocolo = raw_input("Choose Protocol ssh/telnet\n").lower()
	if protocolo == "ssh" and len(protocolo) == 3:
		ip = raw_input("Please Enter the IP Address \n")
		test = os.system('ping ' '-c 5 -W 1 '+ str(ip) + ' >  /dev/null')
		if not test:
			print u"\033[92m [+] Device Reachable" 
			conexion(ip)
		else:
			print u"\033[91m [-] Device Unreachable"
			print "[*] Re enter the information"
			print u"\x1b[0m"	
			main()	
	elif protocolo == "telnet" and len(protocolo) == 6:
		ip = raw_input("Please Enter the IP Address \n")
		test = os.system('ping ' '-c 5 -W 1 '+ str(ip) + ' >  /dev/null')
		if not test:
			print u"\033[92m [+] Device Reachable........"
			conexion(ip)
		else:
			print "[-] Device Unreachable"
			main()
	else:
		main()

if __name__ == "__main__":
	main()

Es este el ejemplo del troubleshooting, cuando se nos ha caído un dispositivo y queremos mitigar una vez dentro de el, igual le pueden agregar otras funciones para que realice otros comandos, etc.. también pueden encontrad mas scripts en mi github: https://github.com/chapo182/Python-script-for-troubleshoot-cisco-devices

Como se pueden dar cuenta tenemos un gran poder con python y se puede emplear en todo, tiene una sintaxis muy linda y practica que nos permitida interactuar en cualquier entorno.

Carlos Leyva - Programador de python experto en seguridad informatica

Comentarios

  1. avatar
    Pablo dijo

    elif protocolo == "telnet" and len(protocolo) == 6:

    ¿Por qué compruebas la longitud de la cadena? Si protocolo == "telnet" devuelve True, la longitud es de 6, no hace falta comprobarlo (creo).

    Buen post, cosas cómo paramiko y scapy hacen que tenga ganas de aprender python.

  2. avatar
    Raúl dijo

    No conocía la faceta oculta de Errejón como sysadmin

Pública un comentario