Page 1 sur 1
[R] Attendre un mot dans PuTTY ou l'invité de commande
Posté : jeu. 19 mars 2015 16:47
par caropost
Bonjour à tous,
Nouvelle dans la programmation avec AutoIt, je viens solliciter votre aide d'experts
Pour vous mettre dans le contexte : je me connecte avec le port série à un switch via PuTTY et je souhaiterais automatiser certaines tâches. Je souhaiterais que mon programme vérifie de temps en temps qu'il fait bien ce qu'il faut au bon moment (par exemple attendre l'apparition du mot "login" avant de rentrer le login). Pour l'instant, je m'en sors avec des Sleep mais il suffit que pour une raison X ou Y la tâche précédente mette plus de temps que d'habitude à se réaliser pour empêcher le bon fonctionnement de mon script.
J'ai fais des recherches sur internet, sur ce forum et celui en anglais, j'ai regardé les exemples fournis lors de l'installation du logiciel, j'ai testé des choses mais sans résultats

Je suis coincé, pourriez-vous m'aider svp ?
Je vous remercie par avance

Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : jeu. 19 mars 2015 17:19
par Tlem
Re bonjour Caro.
Essayez plutôt d'utiliser un UDF conçu pour dialoguer avec Putty ou similaire.
Voici deux liens du forum US concernant de tels UDF :
-
http://www.autoitscript.com/forum/topic/166579-udf-ssh
-
http://www.autoitscript.com/forum/topic ... nk-wrapper
Il me semble qu'il y a d'autres exemples ici et là bas.

Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : jeu. 19 mars 2015 19:34
par jguinch
Je te conseille de te tourner vers plink, qui sera plus facilement automatisable (si tu en as la possibilité)
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 20 mars 2015 10:45
par caropost
Merci pour vos réponses
J'ai testé mais je n'arrive pas à me connecter

En même temps, je ne peux pas installer Plink sur le pc...
C'est dommage parce que c'est vraiment ça qu'il me manque pour finir mon script : récupérer des données de la fenêtre (PuTTY ou invité de commande) et pouvoir les exploiter

Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 20 mars 2015 11:43
par jguinch
Plink ne nécessite pas d'installation, il peut être utilisé comme exécutable autonome (tout comme Putty) :
http://www.chiark.greenend.org.uk/~sgta ... nload.html
Il est alors possible de l'inclure dans l'exécutable au moment de la compilation, l'extraire sur le poste client dans un répertoire temporaire pour l'utiliser, puis le supprimer du répertoire temporaire => voir FileInstall
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 20 mars 2015 14:16
par caropost
Oui pardon (le pire c'est que je le sais -_- Ce doit être le vendredi, avant le week-end ^^)
Lorsque je lance l'exécutable, il me dit que Plink n'est pas une application valide pour Win32...
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 20 mars 2015 15:22
par orax
C'est dommage parce que c'est vraiment ça qu'il te manque pour finir ton script.
Le fichier téléchargé est peut-être corrompu ou l'antivirus aurait pu le bloquer. Retélécharge le dans le doute
http://the.earth.li/~sgtatham/putty/lat ... /plink.exe
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : lun. 23 mars 2015 10:13
par caropost
Ce n'est pas gentil de se moquer des demoiselles en détresse
Et ce n'est pas tout à fait ce qu'il me manque, dans l'idéal ce serait de pouvoir ouvrir mon profil pré-enregistré dans PuTTY ou de pouvoir enregistrer un fichier qui m'informerai si la configuration s'est bien déroulée ou non sans avoir à utiliser des clics de souris mais je ne sais pas si c'est faisable...
J'ai retéléchargé Plink avec ton lien, c'était le 6ème téléchargement et le 6ème échec... (c'est "marrant", suivant le lien où je l'ai téléchargé, soit le pc m'affiche un pop up m'informant que ce n'est pas une appli pour Win32, soit une sorte d'invité de commande s'ouvre pour se refermer un quart de seconde plus tard).
Comme j'utilise le port série pour me connecter au switch, je pourrais m'en servir pour récupérer l'information en sortie ?
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : lun. 23 mars 2015 14:35
par orax
caropost a écrit :soit une sorte d'invité de commande s'ouvre pour se refermer un quart de seconde plus tard
C'est normal puisque c'est un programme en ligne de commande. Il faut l'exécuter depuis l'invite de commande :
touche MAJ + clic droit dans le dossier où est Plink > fenêtre de commande...
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : lun. 23 mars 2015 15:22
par caropost
Oui, j'ai vu ça mais il n'y a pas l'option pour me connecter en série... Je vais regarder un peu sur internet (j'ai pas encore cherché, on m'a interrompu ^^)
J'ai réussi à me connecter en SSH mais le but de la manoeuvre est de me connecter en série pour rentrer l'adresse IP du switch et faire le reste de la configuration et de temps en temps, contrôler que ça se passe bien (par exemple, vérifier que le switch demande bien le login et le mdp pour pouvoir les insérer, vérifier que la ligne que j'attends est bien présente pour faire ce que le script simule la touche entrée plutôt que de faire un sleep etc).
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : lun. 23 mars 2015 16:04
par jguinch
Connexion au port série :
plink.exe -serial 
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : lun. 23 mars 2015 16:08
par caropost
jguinch a écrit :Connexion au port série :
plink.exe -serial 
Malheureusement, le PC a un XP tellement vieux qu'il ne propose pas l'option série

Je ne pense pas qu'il sera possible de mettre un minimum à jour ce PC donc je pense que l'option plink tombe à l'eau

Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : mar. 24 mars 2015 16:54
par caropost
Je teste de partir sur le CommAPI pour les communications série (
https://www.autoitscript.com/wiki/CommAPI). J'ai pris les scripts fournis et le premier exemple mais il me retourne l'erreur comme quoi il ne peut pas utiliser kernel32.dll. Savez-vous comment résoudre le problème ?
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : mar. 24 mars 2015 18:26
par orax
caropost a écrit :Malheureusement, le PC a un XP tellement vieux qu'il ne propose pas l'option série

Je ne vois pas le rapport... M'enfin dans le doute j'ai quand même vérifié sur un "vieux" XP et il y a bien -serial.
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : mer. 25 mars 2015 15:03
par caropost
Oui pardon, c'était en fait la version de plink qui devait être trop ancienne, je l'ai retéléchargé et maintenant l'option -serial apparait.
Je peux lancer plink, je peux également lancer un profil préenregistré mais je n'arrive toujours pas à détecter si ma fenêtre affiche bien "login :" ou non... J'ai essayé en reprenant les liens donnés par Tlem mais sans succès. j'ai une fenêtre qui se lance et se ferme quelques dizaines de millisecondes plus tard.
Depuis ce lien :
http://www.autoitscript.com/forum/topic ... k-wrapper/
J'ai créé un script qui inclus ce script, lancé ma connexion série :
Code : Tout sélectionner
_Start_plink("C:/Program Files/PuTTY/plink.exe", "Mon profil")
J'ai donc modifié un peu le handle en :
Code : Tout sélectionner
$_plinkhandle = Run(@comspec & " /c" & $_plink_loc & " -serial " & $_plinkserver,"",@SW_HIDE,7)
ainsi que d'autres modifications mais je n'ai pas une fenêtre qui s'ouvre et reste (même en commentant la ligne qui commence par fermer plink).
Me disant que ça venait de ce que j'avais écris, refais la même chose mais en reprenant le script original et en gardant un connexion SSH.
Code : Tout sélectionner
_Start_plink("C:/Program Files/PuTTY/plink.exe", "192.168.5.15")
Et la même chose se passe : une fenêtre s'ouvre et se referme quelques dizaines de millisecondes après).
Sauriez-vous me dire ce que je fais de mal ?
Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : mar. 07 avr. 2015 09:40
par caropost
Bonjour,
Pour essayer de savoir ce qu'une fenêtre de console (Putty ou Plink) affiche pour pouvoir dire à mon script de continuer, je souhaite utiliser STDINWRITE et STDOUTREAD.
J'ai essayé plusieurs façons et aucune ne fonctionne comme je le souhaite.
J'ai repris le script Plink Wrapper pour l'adapter un peu à mes besoins mais aucun de mes tests ne fonctionne correctement.
Voici les fonctions que j'utilise :
► Afficher le texte
Code : Tout sélectionner
;start the plink session
func _Start_plink($_plink_loc,$_plinkserver)
_Plink_close(); close any stray plink sessions before starting
if $_plink_loc = "" then
MsgBox(0, "Error", "Unable to open plink.exe",10)
return false
Exit
endif
if $_plinkserver = "" then
MsgBox(0, "Error", "Unable to open server",10)
Exit
return false
endif
; $_plinkhandle = Run(@comspec & " /c" & $_plink_loc & " -ssh " & $_plinkserver,"",@SW_MAXIMISE, 7) ; $STDIN_CHILD + $STDOUT_CHILD + $STDERR_CHILD)
$_plinkhandle = Run($_plink_loc & " -load " & $_plinkserver,"",@SW_MAXIMIZE, $STDIN_CHILD+$STDOUT_CHILD)
return $_plinkhandle
endFunc
;Initialize plink session log file
func _Init_plink_log($_plink_logfile)
$_plink_logfile_handle = FileOpen($_plink_logfile, 2)
; Check if file opened for writing OK
If $_plink_logfile_handle = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
return true
endfunc
func _Expect($match_text)
local $text
local $sBuffertext
local $found
local $iBegin = TimerInit()
While 1
if TimerDiff($iBegin) > $_plink_timeout then return false
$text = StdoutRead($_plinkhandle)
MsgBox(0, "Test", $text)
$sBuffertext = $sBuffertext & $text
if $_plink_logging Then
filewriteline($_plink_logfile_handle,"**********************NEW SECTION************************")
filewrite($_plink_logfile_handle, $match_text)
filewrite($_plink_logfile_handle, $text)
filewriteline($_plink_logfile_handle,"**********************END SECTION************************")
endif
$found = StringRegExp($text,$match_text)
If $found = 1 Then
If $_plink_display_messages Then MsgBox(4096, $match_text, $text, $_plink_display_message_time)
ExitLoop
endif
sleep(100)
Wend
return $sBuffertext
EndFunc
Et voici ce que je fais :
► Afficher le texte
Code : Tout sélectionner
$username="admin "
$_plink_logging=true ; Turn Logging ON (default is off)
$_plink_display_messages=true ; Turn Screen Messages ON (default is on)
$_plink_display_message_time=5 ; Display message for 5 secs (default 1 sec)
$_plinkhandle=_Start_plink("C:\Program Files\PuTTY\putty.exe",'"mon profil"')
;$_plinkhandle=_Start_plink("C:\Program Files\PuTTY\putty.exe","192.168.5.15")
_Init_plink_log("D:\Documents and Settings\Desktop\putty.log")
_Expect("login as:")
Send($username)
;_SayPlus($username)
Les problèmes sont que ma fenêtre "Test" (dans la fonction Expect) s'ouvre vide et que le fichier de log se rempli comme ceci jusqu'à ce que j'arrête le script manuellement :
► Afficher le texte
Code : Tout sélectionner
**********************NEW SECTION************************
login as:**********************END SECTION************************
**********************NEW SECTION************************
login as:**********************END SECTION************************
**********************NEW SECTION************************
login as:**********************END SECTION************************
Sauriez-vous m'aider à corriger mon erreur ? Merci d'avance

Re: [...] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 29 mai 2015 10:42
par caropost
Ce problème a été résolu

Re: [R] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 29 mai 2015 10:45
par jbnh
N'hésite pas a poster ta solution... pour les prochains

Re: [R] Attendre un mot dans PuTTY ou l'invité de commande
Posté : ven. 29 mai 2015 15:06
par caropost
Au final je n'utilise pas PuTTY mais plink
Les fonctions que j'utilise (dans un lien donné plus haut) :
► Afficher le texte
Code : Tout sélectionner
; #VARIABLES# ====================================================================================================================
global $_plinkhandle="" ; used to handle starting of plink
global $_plinkserver="" ; name of server you wish to connect to
global $_plink_loc ="" ; location of plink.exe executable on workstation
global $_plink_display_messages=false ; display interim messages to screen (default false)
global $_plink_display_message_time=1 ; time in seconds messages are displayed
global $_plink_logging=false ; record plink log file (default false)
global $_plink_logfile="" ; location of plink log file
global $_plink_logfile_handle="" ; plink log file handle
Global const $_plink_timeout=500000
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _Plink_close
; ===============================================================================================================================
func _Plink_close()
;If there are any stray plink sessions kill them
if ProcessExists("plink.exe") then
ProcessClose("plink.exe")
Else
return false
endif
EndFunc
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _Start_plink
; ===============================================================================================================================
;start the plink session
func _Start_plink($_plink_loc,$_plinkserver)
_Plink_close(); close any stray plink sessions before starting
if $_plink_loc = "" then
MsgBox(0, "Error", "Unable to open plink.exe",10)
return false
Exit
endif
if $_plinkserver = "" then
MsgBox(0, "Error", "Unable to open server",10)
Exit
return false
endif
$_plinkhandle = Run($_plink_loc & " -serial " & $_plinkserver,"",@SW_MAXIMIZE, $STDIN_CHILD + $STDOUT_CHILD)
return $_plinkhandle
endFunc
; #FUNCTION# ====================================================================================================================
; Name...........: _Init_plink_log
; ===============================================================================================================================
;Initialize plink session log file
func _Init_plink_log($_plink_logfile)
$_plink_logfile_handle = FileOpen($_plink_logfile, 2)
; Check if file opened for writing OK
If $_plink_logfile_handle = -1 Then
MsgBox(0, "Error", "Unable to open file.")
Exit
EndIf
return true
endfunc
; ===============================================================================================================================
; #FUNCTION# ====================================================================================================================
; Name...........: _Expect
; ===============================================================================================================================
func _Expect($match_text)
local $text
local $sBuffertext
local $found
local $iBegin = TimerInit()
While 1
if TimerDiff($iBegin) > $_plink_timeout then return false
$text = StdoutRead($_plinkhandle)
$sBuffertext = $sBuffertext & $text
if $_plink_logging Then
filewriteline($_plink_logfile_handle,"**********************NEW SECTION************************")
FileWriteLine($_plink_logfile_handle, "expect : " & $match_text)
FileWriteLine($_plink_logfile_handle, "read : " & $text)
; filewriteline($_plink_logfile_handle,"**********************END SECTION************************")
endif
$found = StringRegExp($text,$match_text)
If $found = 1 Then
; If $_plink_display_messages Then MsgBox(4096, $match_text, $text, $_plink_display_message_time)
ExitLoop
Endif
sleep(1000)
Wend
return $sBuffertext
EndFunc
; #FUNCTION# ====================================================================================================================
; Name...........: _SayPlus
; ===============================================================================================================================
func _SayPlus($output)
StdinWrite($_plinkhandle, $output & @CR)
endfunc
Et mon bout de code :
► Afficher le texte
Code : Tout sélectionner
#include <PlinkWrapper_Test.au3>
$user = "user"
$password = "switch"
$_plink_logging=true ; Turn Logging ON (default is off)
$_plink_display_messages=true ; Turn Screen Messages ON (default is on)
$_plink_display_message_time=300 ; Display message for 5 min
$_plinkhandle=_Start_plink("plink.exe","COM1 -sercfg 9200,8,n,1,N"); Initialized plink connection to server
_Init_plink_log("\Desktop\Log.log")
_Say(@CR)
_Expect("login :")
_SayPlus($user)
_Expect("password")
_SayPlus($password)
_Expect("Connected")
Bon, par contre, ça fonctionne si on est branché en direct sur le PC mais pas si on est branché via un adaptateur USB/Série, ce qui m'embête énormément sinon tout mon truc tombe à l'eau
