[..] Récupérer le retour d'un commande envoyé sur un routeur

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
angelz
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 17 juil. 2012 16:37
Status : Hors ligne

[..] Récupérer le retour d'un commande envoyé sur un routeur

#1

Message par angelz »

Bonjour a tous,

Je bloque pour récupérer le retour d'un "show line" sur un routeur.
Je m'explique.

J'ai fait un script qui me permet de lancé un invite de commande sous Windows puis il me connecte a mon équipement de rebond avec lequel j’accède a un routeur a qui j’envoie la commande "show line".
J'envoie cette commande grâce à un send.

Mon problème est que je n'arrive pas à voir comment récupérer le retour de ma commande vue que le send ne retourne rien.

Si quelqu'un a une idée je suis preneur merci d'avance.
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#2

Message par blacksoul305 »

Bonjour,

je suis pas sur d'avoir compris. Apparemment tu souhaiterais avoir un retour après avoir lancé une commande via le CMD ? Si c'est le cas, tu devrais lire le code posté par ani, qui m'a beaucoup aidé : ici.
Étudiant en 2ème année de Licence Informatique.
angelz
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 17 juil. 2012 16:37
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#3

Message par angelz »

Merci blacksoul305,

J'ai essayé de prendre exemple sur la solution que l'on t'avait apporté avec le Run et le ConsolWrite.Mais cela lance la commande dans un nouvelle invite de commande et non dans celui déjà ouvert.

Ce sera peu être plus explicite avec mon script :

Code : Tout sélectionner

Send("{LWIN}");simule un clic sur démarrer
MouseClick ("left",30,940);clic sur Exécuter
sleep(500)
send("cmd");écrit cmd dans Exécuter
send("{ENTER}");simule l'appuie de la touche entrée
send("set PATH=C:\Documents and Settings\BPXZ3853\Desktop\AUTOIT;%PATH%");Variable d'environnement pour plink
send("{ENTER}")
send("plink  -ssh @ip -l login -pw motdepasse -agent");Connexion a mon serveur de rebond
send("{ENTER}")
send("telnet @ip");connection sur le routeur voulue
send("{ENTER}")
send("login");envoie du login
send("{ENTER}")
Send("motdepasse");envoi du mot de passe
send("{ENTER}")
Send("show line");envoie de ma commande
send("{ENTER}")
 
J'ai essayé de remplacer mon Send("show line") par

Code : Tout sélectionner

$CMD = Run(@comspec & " /c show line","","",$STDIN_CHILD + $STDOUT_CHILD)
Local $data
While True
    $data &= StdoutRead($CMD)
    If @error Then ExitLoop
    Sleep(25)
WEnd
ConsoleWrite($data)
 
Mais cela ne convient pas comme expliquer au début.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#4

Message par Tlem »

Au lieu d'utiliser une console DOS et d'essayer de capturer les retours telnet, utilisez directement un UDF dédié à la communication en telnet ou à l'automation de Plink ...
Vous devriez trouver cet UDF sur le forum US. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
blacksoul305
Membre émérite
Membre émérite
Messages : 957
Enregistré le : ven. 18 mars 2011 11:49
Localisation : Au pays des programmeurs.
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#5

Message par blacksoul305 »

+1 pour l'idée de Tlem.

En effet, passer par un UDF spécifique est beaucoup plus fiable et tu auras sûrement plus de fonctionnalités.
Étudiant en 2ème année de Licence Informatique.
angelz
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 17 juil. 2012 16:37
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#6

Message par angelz »

J'ai suivit vos conseils et J'ai trouvé un UDF qui pourrai faire mon bonheur. Cet UDF me permet d'utiliser une fonction qui s'appelle WshPipe, qui me permet si j'ai bien compris d'envoyer une commande et de récupérer le retour dans un tableau.

Voici le code de l'UDF :

Code : Tout sélectionner

Function WshPipe($ShellCMD, OPTIONAL $NoEcho)

    Dim $oExec, $Output

    $oExec = CreateObject("WScript.Shell").Exec($ShellCMD)

    If Not VarType($oExec)=9 $WshPipe="WScript.Shell Exec Unsupported" Exit 10 EndIf

    $Output = $oExec.StdOut.ReadAll + $oExec.StdErr.ReadAll

    If Not $NoEcho $Output Endif

    $WshPipe=Split(Join(Split($Output,CHR(13)),''),CHR(10))

    Exit($oExec.ExitCode)

EndFunction
 
Le problème est qu'il me sort une erreur lorsque je veux l'utiliser. Il met sort :
UDFWSHpipe(2).au3 (159) : ==> Missing separator character after keyword.:
EndFunction
EndFunction^ ERROR

Et le je ne comprends pas d’où viens cette erreur. Si quelqu'un a une idée.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#7

Message par Tlem »

Il faudrait revoir la syntaxe du IF ...
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
angelz
Niveau 1
Niveau 1
Messages : 4
Enregistré le : mar. 17 juil. 2012 16:37
Status : Hors ligne

Re: [..] Récupérer le retour d'un commande envoyé sur un rou

#8

Message par angelz »

Bon je n'ai pas réussi à exploiter cette fonction WshPipe qui en faite n'était pas codé en autoit -_-'.

Donc je suis partie sur autre chose. Maintenant j'utilise le TCPConnect et autre TCPsend et TCPRecv, mais je ne récupère pas ce que j’attends.

Le code édulcoré :

Code : Tout sélectionner

Global $g_IP="xxx.xxx.xxx.xxx"
Global $login = "login"
Global $socket = TCPConnect($g_IP, 23)
$retour=_WaitRecvMsg("login:")


Func _WaitRecvMsg($szMsg)
    Local $Begin = TimerInit()
    While 1
        $i=$i+1
        Local $SrvMes = TCPRecv($socket, 1024)
        FileWrite($log,"retour"&$i&":"&$SrvMes&@CRLF)
        If StringInStr($SrvMes, $szMsg) Then 
           Return $SrvMes
         EndIf
        If TimerDiff($begin) > 5000 Then
            SetError(1)
            Return 0
        EndIf
    WEnd
EndFunc
 
Je récupère bien le numéro de ma connexion que j'ai initialisé en telnet avec TCPConnect, mais je ne reçois jamais le message "login:" que je devrai recevoir, je ne reçois que "ÿý%" au début puis pue rien.

fichier de log :
retour1:ÿý%
retour2:
retour3:
retour4:
retour5:

Si vous voulez tout le code n'hésiter pas a demandé.
Répondre