Python

3 Connexion SSH

Bien que le langage Python offre une certaine simplicité et liberté en matière de programmation, il est fortement conseillé de jeter un œil aux « Python Enhancement Proposals » et plus particulièrement au PEP 8 – « Style Guide for Python Code » qui donne de bons conseils sur la façon de structurer un programme Python, afin d’éviter de prendre de mauvaises habitudes dès le départ, qui seront difficiles à corriger par la suite.

Python possède la librairie native telnetlib qui, accompagnée de getpass et sys, permet de se connecter sur un équipement réseau en gérant les prompts retournés par les systèmes de manière à enchainer les commandes de façon automatisée. L’utilisation des boucles Python permet d’itérer sur des équipements autant que sur des commandes.

Mais pour se connecter de façon sécurisée à un équipement, l’utilisation du protocole SSHv2 est fortement recommandée. Ce protocole est défini dans les RFC 4251, RFC 4252, RFC 4253 et RFC 4254. La librairie Python la plus adaptée à l’utilisation du protocole SSHv2, en tant que client ou serveur, se nomme Paramiko. Se servir de cette librairie impose de prendre en compte des spécificités de dialogues liées à chacun des constructeurs et parfois à certains équipements chez un constructeur. Il faut, entre autre, gérer les clés publiques et privés, tenir compte des délais d’attente entre les commandes et manipuler les mémoires tampon du canal de réception.

#!/usr/bin/env python
import paramiko
import time

ip_address = "192.168.2.10"
username = "user"
password = "pass"

ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(hostname=ip_address,username=username,password=password)
print "Successfully connected to", ip_address

remote_connection = ssh_client.invoke_shell()

remote_connection.send("configure terminal" + "\n")

for vlan in range (2,11):
  print "Creating VLAN number " + str(vlan)
  remote_connection.send("vlan " + str(vlan) + "\n")
  remote_connection.send("name VLAN " + str(vlan) + "\n")
  time.sleep(0.5)

remote_connection.send("end\n")

time.sleep(1)
output = remote_connection.recv(65535)
print output

ssh_client.close

Il faut noter, qu’en environnement de production, il n’est pas sécurisé d’accepter les clés publiques manquantes sans aucun contrôle.