bash et attendre dans le même script?

Jessaye de coder un script qui prend les adresses IP dun fichier .csv et telnet le périphérique pour attraper la sortie de la commande « show version ».

Jusquà présent, jai codé ceci:

#!/bin/bash #!/usr/bin/expect -f FILE1=dispositivos.csv #file with IP"s and device name set Username "user" #this is the user for telnet connection. set Password "this.is.the.pass" #pass for telnet connection. NUMERODISP="$(wc -l $FILE1 | awk "{print $1}")" #this command counts number of devices (IP"s) in the file as it is a .csv file, it only counts number of lines. for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" "NR == num { print $NF }" dispositivoss.csv)" echo "$IP" #this takes the IP from last column from .csv file done 

Je dois compléter la boucle for pour quelle se connecte via telnet à ladresse IP stockée à $ IP et enregistrez la sortie « show version ».

Jai essayé ceci:

for i in `seq 2 $NUMERODISP`; do IP="$(awk -vnum="$i" "NR == num { print $NF }" dispositivoss.csv)" send "telnet $IP\r" expect "Username:" send "$Username\r" expect "Password: " send "$Password\r" expect "*>" send "show version\r" log_file -noappend SN_$IP.dat; expect -ex "--More--" {send -- " "; exp_continue} expect "*>" log_file; done 

mais cela na pas fonctionné.

Est-ce parce que je ne peux pas utiliser bash and expect?

Dans le cas où cest la raison .. comment puis-je envoyer $ IP et $ NUMDISP en tant que variable dans un autre script expect? (ceci cest pourquoi je pense que cest différent de lautre question)

Commentaires

Réponse

#!/bin/bash #!/usr/bin/expect -f 

Euh … non.

Fondamentalement, vous voulez pour les deux programmes pour lire votre script et « faire ce quil faut » pour chaque ligne. Mis à part les problèmes entre la synchronisation de lexécution du script entre les interpréteurs, il est facile de voir que cest impossible au moment où nous avons une ligne qui pourrait être une commande valide dans lune ou lautre langue.

Considérez quelque chose comme ceci dans votre exemple.

set Username "user" 

Il est en fait valable à la fois dans le shell et dans un script expect. Dans le shell, il définit les paramètres de position $1 et $2 sur Username et user, respectivement. Dans expect, il attribue autre chose. Lequel doit-il faire?

Soit divisez votre script expect dans un fichier différent et appelez-le à partir du script shell, soit utilisez le fait quExpect fonctionne sur TCL, ce qui devrait permettre de faire des boucles et des IO en lui-même.


Heureusement dans ce cas, il ya juste un extrait de code expect contenu dans une boucle shell dans votre deuxième bloc de code.

Alors, créez un script shell

#!/bin/bash for i in `seq 2 $NUMERODISP`; do IP="$(...)" expect -f somename.expect $IP done 

et un script expect à appeler depuis le script shell:

#!/usr/bin/expect -f set IP [lindex $argv 0]; spawn telnet $IP expect "Username:" send "$Username\r" ... 

Commentaires

  • @cesar, il existe des moyens de mettre un script expect dans un script shell, mais il y a toujours des maux de tête autour des guillemets et des variables. Cest la manière la plus propre.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *