Page 1 sur 1
[..] Automatiser Telnet
Posté : mer. 08 oct. 2008 10:07
par Manwe
Bonjour,
Je cherche a faire un équivalent à expect sous autoit pour automatiser du telnet.
L'idée est de lancer une session dos, d'utiliser une fonction send qui envoie la commande a la session, et expect qui attend une chaine de caractères pendant un certain temps.
J'utilise donc
Code : Tout sélectionner
Run(@ComSpec & " /c cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDERR_CHILD + $STDOUT_CHILD)
StdinWrite
StderrRead
et StdoutRead
Ca fonctionne bien pour des fonctions comme dir, mais dès que je lance telnet, il n'arrive pas à récupérer de chaine de caractères.
Je ne pense pas que ca vienne du script, mais plus de la façon dont est géré telnet sous dos.
Quelqu'un aurait une idée ?
Merci d'avance
Mon début de script :
► Afficher le texte
Code : Tout sélectionner
#include <Constants.au3>
#Include <File.au3>
;~ Local $foo = Run(@ComSpec & " /c "&@ScriptDir&"\plink.exe -telnet 172.16.9.93", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDERR_CHILD + $STDOUT_CHILD)
Local $foo = Run(@ComSpec & " /c cmd.exe", @SystemDir, @SW_HIDE, $STDIN_CHILD + $STDERR_CHILD + $STDOUT_CHILD)
expect($foo, "Microsoft", 3)
expSend($foo, "dir")
expect($foo, "File(s)", 3)
expSend($foo, "telnet")
expect($foo, "Welcome", 3)
Func expect ($process, $expectedString, $timeout)
dbgLog ("Expect : '"&$expectedString& "', with timeout: "&$timeout, 2)
$rep_err=""
$rep_ok=""
For $i = 1 to $timeout
$rep_err &= StderrRead($process)
dbgLog ("StdoutRead $rep_err: "&$rep_err, 3)
If @error Then
MsgBox(0, "Error : STDERR read:", $rep_err)
ExitLoop
EndIf
If StringInStr($rep_err,$expectedString)<>0 Then
dbgLog ("Expected string in STDERR : '"&$expectedString& "' found", 2)
Return 1
EndIf
$rep_ok &= StdoutRead($process)
dbgLog ("StdoutRead $rep_ok: "&$rep_ok, 3)
If @error Then
MsgBox(0, "Error : STDOUT read:", $rep_err)
ExitLoop
EndIf
If StringInStr($rep_ok,$expectedString)<>0 Then
dbgLog ("Expected string : '"&$expectedString& "' found", 2)
Return 1
EndIf
Sleep (1000)
Next
dbgLog ("FAILED, Expected string '"&$expectedString&"' not found. ", 1)
dbgLog ("StdoutRead : "& $rep_ok, 1)
MsgBox(0, "", "FAILED, Expected string '"&$expectedString&"' not found. ", 2)
Return 0
EndFunc
Func expSend ($process, $inputText)
dbgLog ("expSend : "& $inputText, 2)
StdinWrite($process, $inputText & @CRLF )
StdinWrite($process)
EndFunc
Func dbgLog($text, $dbglevelAsked)
$dbglevel = 3
; Set dbglevel = 1 to have only errors messages
; Set dbglevel = 2 to have errors and warning messages
; Set dbglevel = 3 to have all DBG messages
$outputFile = "./DBG_"&@ScriptName&".txt"
if IsDeclared("firstCall") == 0 Then
$file = FileOpen($outputFile, 2)
FileClose($file)
Global $firstCall = 1
EndIf
If ($dbglevelAsked) <= $dbglevel Then
_FileWriteLog($outputFile, $text)
EndIf
EndFunc
ShellExecute("./DBG_"&@ScriptName&".txt", "", @ScriptDir, "edit")
Re: [..] Automatiser telnet
Posté : jeu. 09 oct. 2008 18:58
par ani
Code : Tout sélectionner
run(telnet ip, @Systemdir, @SW_HIDE, $STDIN_CHILD + $STDERR_CHILD + $STDOUT_CHILD)
run(@comspec & " /k telnet" ....)
y a deux trois petit truc, le global dans la fonction dlog doit se transformer en Local
vérifier si telnet n'est pas déjà actif vu que tu le met en invisible
Je connait telnet que de nom, jamais utilisé, je vais déjà relire ton script

et tester tout çà ('avec l'aide de microsoift telnet

')
Re: [..] Automatiser telnet
Posté : lun. 13 oct. 2008 09:24
par Manwe
Ou alors j'implémente directement le client telnet dans mon script.
Je vais regarder un peu les sockets. A moins qu'un client telnet ait déjà été implémenté.
Re: [..] Automatiser telnet
Posté : mar. 14 oct. 2008 20:52
par TommyDDR
Bon alors, j'ai vu le titre de ta question, (je n'ai pas cherché à lire ton code :$, honte a moi)
et voila ce que j'ai fait :
► Afficher le texte
Code : Tout sélectionner
local $sFrom = InputBox("Telnet","Expéditeur :")
local $sRcpt = InputBox("Telnet","Destinataire :")
local $sData = InputBox("Telnet","Message :")
local $nNombre = InputBox("Telnet","Nombre de fois :")
local $i
Run(@ComSpec & " /k cmd")
WinActivate("","cmd")
WinActivate("cmd")
Send("color 07{ENTER}")
Send("telnet{ENTER}")
Do
$pos = PixelSearch(0,0,500,500,0x00C4CBDE) ; Avoir la position de la fenêtre
Until @error = 0
; TOUTES LES PROCHAINES BOUCLES FOR SERVENT DIR AU PROGRAMME :
; "telnet attend la suite" (le programme cherche un pixel d'écriture de réponse du serveur smtp)
; d'ou le "color 07" plus haut
For $i = 1 To $nNombre
Do
$color = PixelGetColor($pos[0]+324,$pos[1]+30)
Until $color = 0x00C0C0C0
Sleep(100)
Send("o smtp.free.fr 25{ENTER}")
Do
$color = PixelGetColor($pos[0]+76,$pos[1]+31)
Until $color = 0x00C0C0C0
Sleep(100)
Send("MAIL FROM: "&$sFrom&"{ENTER}")
Do
$color = PixelGetColor($pos[0]+7,$pos[1]+54)
Until $color = 0x00C0C0C0
Sleep(100)
Send("rcpt to: "&$sRcpt&"{ENTER}")
Do
$color = PixelGetColor($pos[0]+7,$pos[1]+77)
Until $color = 0x00C0C0C0
Sleep(100)
Send("data{ENTER}")
Do
$color = PixelGetColor($pos[0]+213,$pos[1]+107)
Until $color = 0x00C0C0C0
Send($sData&"{ENTER}")
Sleep(100)
Send(".{ENTER}")
Do
$color = PixelGetColor($pos[0]+53,$pos[1]+142)
Until $color = 0x00C0C0C0
Sleep(100)
Send("quit{ENTER}")
Do
$color = PixelGetColor($pos[0]+317,$pos[1]+227)
Until $color = 0x00C0C0C0
Send("{SPACE}")
Sleep(100)
Send("{SPACE}")
Next
Send("quit{ENTER}")
Send("exit{ENTER}")
Re: [..] Automatiser Telnet
Posté : mer. 15 oct. 2008 09:03
par Manwe
Merci bcp. C'est bien fait.
Mais tu ne contrôles pas ce que te renvoie le serveur, en cas d'erreur par exemple. Mon idée est de lancer un script sur des machines qui ont un pb. Donc d'envoyer des commandes, et vérifier ce que l'on me renvoie.
Donc le comportement n'est pas tjs le même, et il faut que je puisse gérer les erreurs.
J'ai trouvé un petit script de client telnet (ca peut pt-être t'intéresser). J'arrive a le faire tourner sur certains serveurs telnet, mais pas sur une Fédora (dommage c'est ce qui m'intéresse

). Bizarre.
► Afficher le texte
Code : Tout sélectionner
#include <GUIConstants.au3>
;TCP starten
TCPStartup ()
;GUI Creation
GuiCreate("Telnet Client", 500, 390,-1, -1 )
;----------> GUI Control Creation Anfang <----------
;Edit Control für Chat Text
$Edit = GuiCtrlCreateEdit("", 10, 10, 480, 330)
;Input Control für Chat Text Eingabe
$Input = GuiCtrlCreateInput("", 10, 360, 480, 20)
;-----------> GUI Control Creation Ende <-----------
;user input for host and port
$HostI = InputBox ( "Telnet Client", "Please enter the name of the host you want to connect to" )
$PortI = InputBox ( "Telnet Client", "Please enter the port of the host" )
;GUI sichtbar machen
GUISetState ()
ControlSend ( "Telnet Client","", $Edit, "{TAB}")
;Client Hostname auflösen
$Host = TCPNameToIP ( $HostI )
;Mit Host Connecten
$Conection = TCPConnect ( $Host, $PortI )
If @error Then Exit
While 1
$msg = GuiGetMsg()
If $msg = $GUI_EVENT_CLOSE Then Exit
$recv = TCPRecv ( $Conection,2048 )
If $recv <> "" Then
$text = GUICtrlRead ( $Edit )
GUICtrlSetData ( $Edit,$text & $recv )
ControlSend ( "Telnet Client","", $Edit, "{ENTER}")
EndIf
If $msg = $Input Then
$text = GUICtrlRead ( $Edit )
$eingabe = GUICtrlRead ( $Input )
GUICtrlSetData ( $Edit, $text & $eingabe )
GUICtrlSetData ( $Input, "" )
ControlSend ( "Telnet Client","", $Edit, "{ENTER}")
TCPSend ( $Conection, $eingabe & Chr ( 10 ) )
If @error Then
MsgBox (0,"","Error")
Exit
EndIf
EndIf
WEnd
Re: [..] Automatiser Telnet
Posté : mer. 15 oct. 2008 10:54
par TommyDDR
eu, oui, dsl, j'ai admi qu'il n'y avait pas de problème ^^' désoler, je ne sais pas comment mettre ce que le serveur renvoi dans une variable, donc je détect un pixel (méthode un peu barbare je sais ^^')
Petit UP du code source (qui gere maintenent les FAI : free et orange)
► Afficher le texte
Code : Tout sélectionner
local $sFrom = InputBox("Telnet","Expéditeur :")
local $sRcpt = InputBox("Telnet","Destinataire :")
local $sData = InputBox("Telnet","Message :")
local $nNombre = InputBox("Telnet","Nombre de fois :")
Local $sSmtp
local $i
Dim $pos[2]
$pos[0] = -1
Do
$sSmtp = InputBox("Telnet","Fournisseur d'Acces à Internet :"&@CR&@CR&"1) Free"&@CR&"2) Orange")
Until $sSmtp > 0 And $sSmtp < 3
If $sSmtp = 1 Then
$sSmtp = "o smtp.free.fr 25"
ElseIf $sSmtp = 2 Then
$sSmtp = "o smtp.orange.fr 25"
EndIf
Run(@ComSpec & " /k cmd")
WinActivate("","cmd")
WinActivate("cmd")
Send("color 07{ENTER}")
Send("telnet{ENTER}")
HotKeySet("a","getmouse")
while ($pos[0] = -1)
ToolTip("Mettez la souris dans la fenetre en haut a droi SUR LE NOIR et appuyez sur ""a""")
Sleep(100)
WEnd
HotKeySet("a")
; TOUTES LES PROCHAINES BOUCLES FOR SERVENT DIR AU PROGRAMME :
; "telnet attend la suite" (le programme cherche un pixel d'écriture de réponse du serveur smtp)
; d'ou le "color 07" plus haut
For $i = 1 To $nNombre
Do
$color = PixelGetColor($pos[0]+324-3,$pos[1]+30-26)
Until $color = 0x00C0C0C0
Sleep(100)
Send($sSmtp&"{ENTER}")
Do
$color = PixelGetColor($pos[0]+5-3,$pos[1]+48-26)
Until $color = 0x00C0C0C0
Sleep(100)
Send("MAIL FROM: "&$sFrom&"{ENTER}")
Do
$color = PixelGetColor($pos[0]+7-3,$pos[1]+54-26)
Until $color = 0x00C0C0C0
Sleep(100)
Send("rcpt to: "&$sRcpt&"{ENTER}")
Do
$color = PixelGetColor($pos[0]+7-3,$pos[1]+77-26)
Until $color = 0x00C0C0C0
Sleep(100)
Send("data{ENTER}")
Do
$color = PixelGetColor($pos[0]+213-3,$pos[1]+107-26)
Until $color = 0x00C0C0C0
Send($sData&"{ENTER}")
Sleep(100)
Send(".{ENTER}")
Do
$color = PixelGetColor($pos[0]+53-3,$pos[1]+142-26)
Until $color = 0x00C0C0C0
Sleep(100)
Send("quit{ENTER}")
Do
$color = PixelGetColor($pos[0]+317-3,$pos[1]+227-26)
Until $color = 0x00C0C0C0
Send("{SPACE}")
Sleep(100)
Send("{SPACE}")
Next
Send("quit{ENTER}")
Send("exit{ENTER}")
Send("exit{ENTER}")
Func getmouse()
Do
$pos = MouseGetPos()
Until PixelGetColor($pos[0],$pos[1]) = 0x000000
Do
$pos[1]-=1
Until Not (PixelGetColor($pos[0], $pos[1]) = 0x000000)
$pos[1]+=1
Do
$pos[0]-=1
Until Not (PixelGetColor($pos[0], $pos[1]) = 0x000000)
$pos[0]+=1
EndFunc