je tente d'utiliser expect avec Perl mais je bute sur un sérieux problème. Je sais qu'il existe un module expect.pm mais je veux utiliser le expect normal.
J'ai plusieurs lignes à envoyer à expect et ça bloque dès que j'ai un "send".
my $commandes = "set timeout 5\n".
"spawn telnet 192.168.1.1\n".
"sleep 5\n".
"send \"root\r\"\n".
"sleep 1\n".
"send \"xxxxxx\r\"\n".
"sleep 1\n".
"send \"ifconfig ppp0\r\"\n".
"sleep 1\n".
"send \"exit\r\"\n";
open ( my $pipe, '-|', "echo \"$commandes\" | expect 2>&1" );
while ( my $ligne = <$pipe> ) {print "$ligne\n"}
Je mets mes commandes expect dans une variables pour plus de lisibilité. Je lance ensuite un shell en envoyant cette variable vers expect. J'ai mis des sleep au lieu d'attendre une chaine de caractère afin de simplifier au maximum en attendant de résoudre le problème.
Les trois première lignes semblent s'exécuter car telnet se lance (je le vois avec ps dans un autre shell) puis j'ai un délai de 5 secondes avant d'avoir une erreur.
Voici ce qui s'affiche:
spawn telnet -b 192.168.5.201 192.168.14.254
... attente de 5 secondes...
usage: send [args] string
while executing
""send ifconfig ppp0
Une idée de l'origine du problème ?
# quotes
Posté par Pascal Terjan (site web personnel) . Évalué à 3.
Il doit falloir mettre \\\" dans tes commandes
[^] # Re: quotes
Posté par gremous . Évalué à 2.
J'ai testé avec netcat pour simuler un telnet puis je suis passé à telnet, puis je suis passé à ssh car c'était le but au départ.
Le code ressemble à ça:
my $commandes = "set timeout 5\n".
"spawn telnet -b 192.168.5.201 192.168.14.254\n".
"expect \\\"login:\\\"\n".
"send \\\"admin\\r\\\"\n".
"expect \\\"Password:\\\"\n".
"send \\\"SDCroute\\r\\\"\n".
"expect \\\"#\\\"\n".
"send \\\"ifconfig ppp0\\r\\\"\n".
"expect \\\"#\\\"\n".
"send \\\"exit\\r\\\"\n";
open ( my $pipe, '-|', "echo -e \"$commandes\" | expect 2>&1" );
Ca m'agace de me faire avoir pour un truc aussi simple :-)
Maintenant je récupère l'adresse ip en sortie avec sed et c'est bon.
# Net::Telnet
Posté par Raphaël SurcouF (site web personnel) . Évalué à -1.
http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Teln(...)
[^] # Re: Net::Telnet
Posté par gremous . Évalué à 0.
Parceque j'utilise ssh, et comme je suis tombé sur un os j'ai utilisé telnet pour tenter de simplifier les choses. Et j'ai même utilisé netcat pour simplifier encore. Pas la peine de me dire que Net::ssh existe car il ne fonctionne pas dans mon cas car il faut impérativement une authentification par clé publique ce qui n'est vraiment pas pratique avec un script qui interroge bêtement un modem.
Parceque chaque ajout avec use machin::truc dans perl pourri un peu plus chaque machine sur laquelle est installé le script, alors que cette fonction n'est utilisée que par quelques machines. Et en plus ça charge le tout au démarrage du script même si ça ne sert jamais.
Je n'ai pas d'autres raisons :-)
[^] # Re: Net::Telnet
Posté par Raphaël SurcouF (site web personnel) . Évalué à 2.
Ton exemple pourrait tout aussi bien être écrit en Bash.
Et si tu connaissais l'utilisation des modules, tu saurais qu'on n'est pas obligé de tout charger pour n'utiliser qu'une fonction.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.