Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Je débute en Python!

+3 votes

Hello la bande, je suis Cedric l'informaticien... débutant...

J'ai régulièrement un fichier à déposer sur des routeurs Cisco, une centaine, à chaque fois je me tape le transfert tftp à la main, saoulant! je souhaite donc faire un script python qui ferait tout ça a ma place.
Voici le script, simple pour vous, on se moque pas ;-)

import telnetlib
import time

compteur_ligne = 0
SRST = []
compteur_SRST = 0

with open("fichier_config.txt","r") as fichier_config:
    for ligne_fichier in fichier_config:
    if compteur_ligne == 8:
        MOH = ligne_fichier
    if compteur_ligne == 11:
        IPTFTP = ligne_fichier
    if compteur_ligne >= 14:
        SRST.append(ligne_fichier)
    compteur_ligne += 1

for val in SRST:
    Host,ID,Pass,EnPass = val.split(";")
    print ("Telnet en cours sur " + Host)
    TN = telnetlib.Telnet(Host)
    TN.read_until(b"Username: ")
    TN.write(ID.encode('utf8') + b"\n")
    TN.read_until(b"Password:")
    TN.write(Pass.encode('utf8') + b"\n")
    TN.read_until(b">")
    TN.write(b"EN\n")
    TN.read_until(b"Password: ")
    TN.write(EnPass.encode('utf8') + b"\n")
    TN.read_until(b"#")
    print ("Loggué correctement en tant que " + ID)
    print ("Execution du TFTP en cours...")
    TN.write(b"copy tftp: flash:\n")
    TN.read_until(b"[]? ")
    TN.write(IPTFTP.encode('utf8') + b"\n")
    time.sleep(1)
    print ("etape 1 OK")
    TN.read_until(b"Source filename []? ")
    TN.write(MOH.encode('utf8') + b"\n")
    time.sleep(1)
    print ("etape 2 OK")
    #TN.read_until(b"]? ")
    TN.write(MOH.encode('utf8') + b"\n")
    time.sleep(1)
    print ("etape 3 OK")
    print(TN.read_very_eager())

voici ce que le readveryeager me sort:

b'\r\n?File name not specified\r\n%Error parsing filename (Unknown error 0)\r\nSwitch_Bricol_Ced#TEST.txt\r\nTranslating "TEST.txt"...domain server (255.255.255.255)'

Quand je saisis à la main ces commandes, ça se déroule comme ci dessous:

Switch_Bricol_Ced#copy tftp flash
Address or name of remote host []? 10.0.0.2
Source filename []? TEXT.txt
Destination filename [TEXT.txt]? 

L'ip est bien prise en compte car je n'ai pas de message d'erreur apparent dans le read_very_eager, pas contre il valide à blanc le "source filename" d'où l'erreur "File name not specified" alors que la variable MOH contient bien une valeur, je l'ai affiché avec un simple print.

Qui peut m'aider (en espérant que mes explications soient claires?!?)

Merci par avance!

Et bonnes fêtes de fin d'année à tous!

demandé 23-Dec-2017 par Cedrik76 (124 points)
edité 23-Dec-2017 par foxmask

1 Réponse

+1 vote

Bienvenue dans l'aventure :)

telnet est un protocol non sécurisé, aussi vaudrait il mieux utiliser SSH.

pour automatiser des taches recurrentes, il y a plusieurs outils, du très complet qu'est ansible, au tres leger et suffisant pour des petits coups de main qu'est fabric

avec fabric on s'y prendrait comme ceci :

nom du fichier fabcisco.py :

from fabric.api import local

def go():
    compteur_ligne = 0
    SRST = []
    compteur_SRST = 0

    with open("fichier_config.txt","r") as fichier_config:
    # [...]
    if compteur_ligne >= 14:
        SRST.append(ligne_fichier)
        compteur_ligne += 1

    for val in SRST:
      host,ID,pass,EnPass = val.split(";")
      local('fab transfert -H {host} -u {ID} -p {pass} my_file=mon_supper_fichier".format(host=host, id=ID, pass=pass))

nom du fichier fabfile.py

from fabric.api import run

def transfert(my_file):
    # je me rends dans un dossier du cisco
    with cd('/un/dossier/sur/le/cisco'):
        # envoi d'un fichier sur le cisco
        put(my_file)

donc pour lancer tout ca on fait

fab -f fabcisco go

le premier script va lire le fichier, puis executer localement (avec l'action 'local') la commande fab (le paramètre my_file est le paramètre fournie à la tache transfert suivante qui elle lancera pour chaque host cisco le transfert du fichier voulu

Tout ca c'est à la louche :) Et si on s'évite d'utiliser FTFTP/Telnet

répondu 23-Dec-2017 par foxmask (2,772 points)
edité 23-Dec-2017 par foxmask

Bonjour et merci de la réponse.

Fabric ne semble pas natif?

J'ai finalement reussi de la sorte:

commande = "copy tftp://" + IPTFTP + "/" + MOH + " flash:" + MOH
TN.write(commande.encode('utf8') + b"\n")

Le fichier est copié sur mon matériel Cisco.

copier le texte de votre commentaire, faites une reponse et validez la ;)

...