[R] Récupérer des réponses à des commandes telnet

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

[R] Récupérer des réponses à des commandes telnet

#1

Message par s4nji »

Bonjour,

J'ai un besoin un peu particulier, qui est de trouver sur quel switch est brassé un serveur connaissant sa mac_adress.

En entrée je fournis la mac_adress et en sortie j'aimerais le port et le switch sur lequel il est connecté.
Pour info j'ai une cascade de switch trunkés.

Le principe : je me connecte au premier switch en telnet, je fais un "show mac_address", là j'aimerais que autoIT analyse la réponse, soit c'est un trunk et je suis sur le mauvais switch et je passe sur le switch suivant, soit c'est un port et autoIT quitte en me donnant le port.

Déjà est-ce possible de récupérer les réponses à des commandes telnet ?
Quelle serait la fonction adaptée à mon besoin ?
Si vous avez la gentillesse de me scripter la partie ou j'aimerais récupérer les infos ça serait sympa de votre part.

Merci par avance pour votre aide.

Alex
Modifié en dernier par s4nji le mar. 05 oct. 2010 12:47, modifié 3 fois.
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#2

Message par Manwe »

Bonjour,
J'ai été confronté a des problèmes similaires, et j'utilise AutoIt et plink (putty en ligne de commande) pour me connecter par telnet, et traiter le résultat des commmandes.
Tu peux voir mon post ici: http://www.autoitscript.fr/forum/viewto ... f=6&t=5752

Je viens de voir dans un autre post qu'il y avait une DLL d'Extraputy, il y a peut-être moyen de l'utiliser.
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#3

Message par s4nji »

Je viens de regarder ton script et c'est chaud chaud chaud !
J'ai essayé de comprendre un peu le principe mais la fonction sendExpect ne colle pas avec un procurve j'ai l'impression. Au login des switch procurve y'a plein d'infos qui s'affichent alors c'est compliqué de dire ce qui est "expected" dans la fonction.

Il n'y a pas une méthode plus simple ? :?
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#4

Message par Manwe »

La fonction sendExpect colle avec le texte que tu souhaites.
Tu aurais un log de connexion a un procurve ?
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#5

Message par s4nji »

Alors rectification, oui avec quelques modifications j'ai réussi à me connecter au switch et a envoyer une ligne de commande telnet.

Je pense pouvoir me débrouiller pour la suite avec des "If je vois tel terme dans les 3 secondes, je fais ça, elseif je fais ça sinon je fais ça" mais j'ai pas trouvé le moyen de récupérer la réponse et la mettre dans une variable.

En tout cas un grand merci pour ton aide :wink:
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [R] Récupérer des réponses à des commandes telnet

#6

Message par Manwe »

Tu peux utiliser $expectOutBuffer
► Afficher le texte
Tu lances ta commande, tu attends le prompt, et dans $expectOutBuffer tu auras le résultat de la commande.
Ensuite tu peux faire un stringregExp pour chercher ton adresse MAC dans cette chaine de caractères.
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [R] Récupérer des réponses à des commandes telnet

#7

Message par s4nji »

Effectivement le $expectOutBuffer me semble bien s'il récupère le résultat de la requête telnet.
Le résultat de ma commande donne :

SWITCH04-48# show mac-address a4badb967461
Status and Counters - Address Table - a4badb-967461
MAC Address : a4badb-967461
Located on Port : 1


J'aimerais récupérer le numéro du port qui est 1 dans l'exemple, mais qui changera en fonction de l'adresse Mac entrée. Je pourrais récupérer les 2 derniers caractères du expectoutbuffer par exemple ?

Tu pourrais m'écrire la commande exacte ?

Encore merci !
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#8

Message par Manwe »

Voici ce que je ferais :
► Afficher le texte
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#9

Message par s4nji »

J'ai remplacé ton $texte par $expectOutBuffer qui contient le texte mais ça n'affiche rien.

Et le port n'est pas limité à 1 à 9 mais ça peut aller jusqu'à 48.

Argh j'y suis presque le reste fonctionne :D
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#10

Message par Jerome »

Coucou,


je pense que ce code fonctionnerai mieux dans ton cas.
SWITCH04-48# étant l'interface connection avec telnet, il n'est pas necessaire de l'écrire dans le string.

Code : Tout sélectionner

$text = "show mac-address a4badb967461 Status and Counters - Address Table - a4badb-967461 MAC Address : a4badb-967461 Located on Port : 1"

$array = StringRegExp($text, 'Located on Port : ([0-48]+)', 1)
If Ubound($array) <> 0 Then 
ConsoleWrite("Port:"&$array[0]& @CRLF)
Else
ConsoleWrite("No port found."& @CRLF)
EndIf



Jérôme
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#11

Message par s4nji »

Je ne comprends pas ce $texte ="show mac-address a4badb967461 Status and Counters - Address Table - a4badb-967461 MAC Address : a4badb-967461 Located on Port : 1"

Ce texte est dans $expectOutBuffer et ce n'est pas toujours located on port 1

Je dois remplacer $texte par $expectOutBuffer dans votre code ?

:P
ani
Niveau 11
Niveau 11
Messages : 1826
Enregistré le : lun. 23 juil. 2007 12:31
Localisation : Bureau
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#12

Message par ani »

Salut,
l'exemple fournis par jerome & manwe.

le texte ($Text) est juste un exemple, çà doit correspondre à t'a sortie de la commande telnet

Code : Tout sélectionner

$array = StringRegExp($text, 'Located on Port : ([0-48]+)', 1)
If Ubound($array) <> 0 Then 
ConsoleWrite("Port:"&$array[0]& @CRLF)
Else
ConsoleWrite("No port found."& @CRLF)
EndIf
Graçe à cette expression régulière ($StringRegExp), on recherche dans la sortie le terme Located on port : suivit de chiffre compris entre 0 à 48,celui-ci te retournera uniquement le port.

voilàvoilà en espérant t'avoir eclaircie.
Bonne continuation ;)
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#13

Message par s4nji »

Oui c'est plus clair merci donc mon code c'est celui-là :

Code : Tout sélectionner

$array = StringRegExp($expectOutBuffer, 'Located on Port : ([0-48]+)', 1)
If Ubound($array) <> 0 Then 
ConsoleWrite("Port:"&$array[0]& @CRLF)
Else
ConsoleWrite("No port found."& @CRLF)
EndIf
Je teste ça de suite ! =)
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#14

Message par Manwe »

Il faut effectivement remplacer $text par $expectOutBuffer dans ton script qui fait le telnet.
je me demande si le problème ne peut pas venir des retours à la ligne.
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#15

Message par s4nji »

Ca marche peut-être mais rien ne s'affiche ^^

Y'a pas un "msgbox(4096,"Port",$array,10)" à faire après ?

Ou une autre commande ?

Encore merci :)
Avatar du membre
Jerome
Niveau 9
Niveau 9
Messages : 661
Enregistré le : mar. 07 avr. 2009 08:35
Localisation : Picardie
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#16

Message par Jerome »

Coucou,


La fonction ConsoleWrite écrit le résultat dans la fenêtre SciTE.

Si vous n'êtes pas familier avec cette commande, vous pouvez toujours remplacer par une MsgBox.


Bien que le ConsoleWrite soit plus pratique.




Jérôme
Modifié en dernier par Jerome le ven. 01 oct. 2010 10:34, modifié 1 fois.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#17

Message par s4nji »

j'ai un message d'erreur :

MsgBox(4096,"Resultat","Port:"&$array[0]&@CRLF)
MsgBox(4096,"Resultat","Port:"&$array^ERROR

Error : Subscript used with non-Array variable

Mon code :

Code : Tout sélectionner

If $result = 1 Then 
    $array = StringRegExp($expectOutBuffer, 'Located on Port : ([0-48]+)', 1)
    If Ubound($array) <> 0 Then 
    MsgBox(4096,"Resultat", "Port:"&$array[0]& @CRLF)
    Else
    MsgBox(4096,"Resultat", "Port:"&$array[0]& @CRLF)
    EndIf
:cry:
Avatar du membre
Manwe
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mer. 08 oct. 2008 09:21
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#18

Message par Manwe »

Dans le else, si la taille de ton tableau est nulle, tu ne peux pas afficher $array[0]

Comme le dis Jérome, Consolewrite est assez pratique :
dans Scite tu fais F5, et consolewrite affiche ton texte dans la partie basse de la fenêtre, là ou tu vois aussi les alarmes.
Ca t'évites de cliquer sur tes 50 msgBox, et tu peux les laisser dans ton code pour debuguer, sans que ca apparaisse a l'utilisateur final.
Un clavier azerty en vaut deux.
s4nji
Niveau 1
Niveau 1
Messages : 12
Enregistré le : mar. 28 sept. 2010 11:42
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#19

Message par s4nji »

Je comprends bien l'utilité du F5 pour débugger et d'ailleurs maintenant je l'utilise mais j'aimerais compiler le programme une fois fini et n'utiliser que l'exécutable.

J'ai réussi à faire fonctionner le bazard avec votre aide et j'aimerais encore une petite aide.

Le port peut soit être un nombre de 1 à 48, soit une lettre et un nombre de 1 à 24, selon le switch où se trouve ma mac_address.

Avec ce code j'arrive à afficher les ports du type "A13", "E20" (lettre + nombre) mais du coup ça foire pour les ports du type "24", "13" ...

Code : Tout sélectionner

If $result = 1 Then 
 $array = StringRegExp($expectOutBuffer, 'Located on Port : ([A-Z][0-48]+)', 1)
If Ubound($array) <> 0 Then 
MsgBox(4096,"Resultat", "Port:"&$array[0]& @CRLF)
Else
ConsoleWrite("No port found."& @CRLF)
EndIf
Comment dire que la lettre [A-Z] est facultative ?

Merci !!!
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [..] Récupérer des réponses à des commandes telnet

#20

Message par sksbir »

bonjour

J'arrive apparemment après la bataille, mais il se trouve que autoit n'est pas toujours la solution.
En tout cas, à ta place, j'aurais utilisé Teraterm, lequel contient un langage de scripting assez évolué


Pour ta question sur les expressions régulières, j'ai mis la main sur ce tutoriel en français : http://www.siteduzero.com/tutoriel-3-14 ... e-1-2.html

et ça m'a l'air bien détaillé. Et apparemment, autoit gère bien des expressions en PCRE puisque l'aide de StringRegExp contient un lien : Complete description can be found here qui renvoi ici : http://www.autoitscript.com/autoit3/pcr ... .html#SEC1


A priori, ça devrait donc être : 'Located on Port : ([A-Z][0-48]+)|Located on Port : ([0-48]+)'
Répondre