Forum Programmation.perl Perl et expect

Posté par  .
Étiquettes : aucune
1
26
déc.
2008
Bonjour,

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  (site web personnel) . Évalué à 3.

    Les " ne sont pas assez protégées
    Il doit falloir mettre \\\" dans tes commandes
    • [^] # Re: quotes

      Posté par  . Évalué à 2.

      Merci, c'était exactement ça :-)
      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  (site web personnel) . Évalué à -1.

    Pourquoi ne pas utiliser un module comme Net::Telnet ?

    http://search.cpan.org/~jrogers/Net-Telnet-3.03/lib/Net/Teln(...)
    • [^] # Re: Net::Telnet

      Posté par  . Évalué à 0.

      Parceque la question porte sur expect, pas sur telnet.

      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  (site web personnel) . Évalué à 2.

        Dans ce cas, à quoi bon utiliser Perl si tu n'utilises pas de modules ?
        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.