cURL en processus enfant.

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 53
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

cURL en processus enfant.

#1

Message par Barthandelus »

Bonjour,

Ce n'est pas vraiment une question qui concerne l'AU3, mais je me permet de vous la poser malgré ça. Je souhaiterais effectuer un simple curl dans un processus enfant et récupérer le flux STDOUT pour traitement, mais étrangement, cela ne fonctionne pas correctement.

Lorsque j'effectue la commande directement depuis cmd.exe (exemple : curl autoitscript.fr), ça fonctionne.

Cependant, lorsque j'exécute le code suivant :

#include <AutoItConstants.au3>

$ca_cmd = "curl autoitscript.fr"
Local $ca_iPID = Run("cmd.exe /c " & $ca_cmd, @WindowsDir, @SW_HIDE, $STDOUT_CHILD)
; Ou Local $ca_iPID = Run(@ComSpec & " /c " & $ca_cmd, @WindowsDir, @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($ca_iPID)
Local $ca_output = StdoutRead($ca_iPID)

ConsoleWrite($ca_output)

$ca_output vaut "'curl' n'est pas reconnu en tant que commande interne ou externe, un programme ex‚cutable ou un fichier de commandes."

A noter que j'exécute la commande et le programme sur le même ordinateur, avec la même configuration. Une idée de pourquoi ?

EDIT : Je préférerais utiliser curl en ligne de commande plutôt que via un UDF. Ce qui est étrange, c'est que NMAP de son coté fonctionne bien, programmé de la même manière.

EDIT 2 : Tiré de ce sujet, "Vous devez impérativement utiliser comspec pour exécuter des commandes internes (DIR, COPY, MD, RD, etc ...). Pour les commandes externes (ATTRIB, CACLS, XCOPY, NET, etc ...), comspec n'est pas indispensable.". Il me semble que CURL n'est pas une commande interne.. je me trompe peut être. Cependant, avec ou sans COMSPEC (en passant par cmd.exe), cela ne fonctionne toujours pas.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: cURL en processus enfant.

#2

Message par mikell »

Pour les commandes externes (ATTRIB, CACLS, XCOPY, NET, etc ...), comspec n'est pas indispensable
#include <AutoItConstants.au3>

$ca_cmd = "curl autoitscript.fr"
Local $ca_iPID = Run($ca_cmd, @WindowsDir, @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($ca_iPID)
Local $ca_output = StdoutRead($ca_iPID)

ConsoleWrite($ca_output)
Image
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 53
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Re: cURL en processus enfant.

#3

Message par Barthandelus »

@mikell : Ce bout de code ne m'affiche rien dans la console. Pour être sûr : est-ce que ça affiche quelque chose dans la votre ?

Si c'est le cas, alors le problème viendra forcément de mon installation de curl (libcurl/7.55.1 WinSSL).
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: cURL en processus enfant.  

#4

Message par orax »

Les deux codes sont fonctionnels. Il faudrait donc vérifier l'installation.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 53
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Re: cURL en processus enfant.

#5

Message par Barthandelus »

Ok, j'ai vérifier l'installation de cURL, je possède celle nativement installé avec Windows 10 (Build > 1706), effectivement c'est cette dernière qui pose problème.

En téléchargeant la dernière version de cURL via le site officiel (7.64.0) et en modifiant légèrement le code, ça fonctionne :

#include <AutoItConstants.au3>

Local $ca_iPID = Run(@ScriptDir & "\curl\curl.exe -s autoitscript.fr", @ScriptDir, @SW_HIDE, $STDOUT_CHILD)
ProcessWaitClose($ca_iPID)
Local $ca_output = StdoutRead($ca_iPID)

MsgBox(1, "Test", $ca_output)

Le contenu du dossier /bin/ de cURL doit être coller où vous le souhaitez (moi, je l'ai mis dans le dossier du projet puis /curl/) pour que cela fonctionne. Argument -s nécessaire pour obtenir uniquement l'HTML. Pour vérifier si une réponse est obtenue, entourer d'une condition StringLen($ca_output) > 0. Rien n'est retourner dans le flux STDERR (même avec un MERGE avec le STDOUT).
Répondre