2010-11-24 48 views
1

Je voudrais être en mesure de passer une commande longue à attendre. C'est une commande multiple en quelque sorte. est d'abord ici mon attendre scénarioComment interpréter un ATTENDRE peut caractère échappé à un caractère de commande


#!/usr/bin/expect -f 
set timeout -1 
spawn telnet xxx.xxx.xxx.xxx 
expect "*?username:*" 
send "someusername\r" 
expect "*?assword:*" 
send "somepassword\r" 
# Here's the command I'd like to pass from the command prompt 
set command [lindex $argv 0] 
send "$command\r" 
send "exit\r" 

Je puis exécuter ce script comme si:

./expectscript "mkdir /usr/local/dir1\ncd /usr/local/dir1\ntouch testfile" 

Notez que je mets « \ n » pour ouvrir une entrer comme si je suis le traitement de la commande avant de passer à la suivante.

Je sais que vous pourriez séparer les commandes avec ";", mais pour cet exercice particulier, je voudrais pouvoir espérer interpréter le "\ n" avec un "\ r" de sorte que, s'attendre à se comporter comme si elle était comme ceci:

send "mkdir /usr/local/dir1\r" 
send "cd /usr/local/dir1\r" 
send "touch testfile\r" 

la question devient alors comment peut attendre d'interpréter le « \ n » pour être « \ r »? J'ai essayé de mettre le "\ r" dans l'argument au lieu de "\ n", mais cela ne fonctionne pas.

Merci pour l'entrée.

Répondre

3

Quand je fais une expérience simple, je trouve que le \n dans l'argument n'est pas converti par mon shell (bash) dans une nouvelle ligne; ça reste littéral. Vous pouvez le vérifier par vous-même en utilisant simplement puts pour imprimer l'argument de ligne de commande, comme ceci:

puts [lindex $argv 0] 

Contourner cela nécessite un peu de travail à diviser les choses. Hélas, commande de Tcl split ne pas divisée sur des séquences multi-caractères (il se divise sur de nombreux personnages différents à la fois à la place) donc nous aurons besoin d'une approche différente. Cependant, Tcllib a exactement ce dont nous avons besoin: la commande splitx. Avec cela, nous le faisons (basé sur la réponse de @ tensaix2j):

#!/usr/bin/expect -f 
package require Expect;     # Good practice to put this explicitly 
package require textutil::split; # Part of Tcllib 

# ... add your stuff here ... 
foreach line [textutil::split::splitx [lindex $argv 0] {\\n}] { 
    send "$line\r" 
    # Wait for response and/or prompt? 
} 
# ... add your stuff here ... 

Si vous n'avez pas tcllib installé et configuré pour une utilisation avec Attendez-vous, vous pouvez également snarf le code pour splitx directement du code (trouvez-le en ligne here) tant que vous reconnaissez en interne la licence sous laquelle il se trouve (règles de licence Tcl standard).

+0

Notez qu'il est '{\\ n}' regexp parce que nous voulons faire correspondre une barre oblique inverse-n littéral et c'est la forme qui minimise le nombre d'antislash vous devez écrire pour obtenir le littéral passé l'analyse syntaxique de Tcl et le moteur RE de analyse ... –

+0

Merci de prendre la mesure supplémentaire pour expliquer votre réponse en détail :) – EDJ

0
foreach cmd [ split $command \n ] { 
send "$cmd\r\n" 
} 
+0

Vous voulez certainement ne pas envoyer un '\ n' à la fin de chacun de ceux-ci. –