bash et attendre dans le même script?

9

J'essaye de coder un script qui prend les adresses IP d'un fichier .csv et telnet le périphérique pour attraper la sortie de la commande "show version".

Jusqu'à présent, j'ai 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    

J'ai besoin de compléter la boucle for pour qu'elle se connecte via telnet à l'IP stockée à $ IP et enregistre la sortie "show version".

J'ai essayé avec ça:

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 ça n'a pas marché.

Est-ce que je ne peux pas utiliser bash et attendre?

Dans le cas où c'est la raison .. comment puis-je envoyer $ IP et $ NUMDISP en tant que variable dans un script d'attente différent? (c'est pourquoi je pense que c'est différent de l'autre question)

Cesar Alejandro Villegas Yepez
la source
2
Ne mélangez pas les langues, expectpouvez lire un fichier CSV, comme je l'ai montré dans unix.stackexchange.com/questions/350338/…
jusqu'au
1
Duplication possible de plusieurs connexions Telnet dans Expect while loop
thrig
@thrig l'OP ne pense évidemment pas que ce soit une dupe puisqu'ils viennent de poser cette question.
terdon
J'ai posé les deux questions, je pense que c'est un peu différent de l'autre.
Cesar Alejandro Villegas Yepez

Réponses:

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

Umm ... non.

Fondamentalement, vous voulez que les deux programmes lisent votre script et "fassent la bonne chose" concernant chaque ligne. Mis à part les problèmes entre la synchronisation de l'exécution du script entre les interprètes, il est facile de voir que c'est impossible au moment où nous avons une ligne qui pourrait être une commande valide dans l'une ou l'autre langue.

Considérez quelque chose comme ça dans votre exemple.

set Username "user" 

Il est en fait valide à la fois dans le shell et dans un script attendu. Dans le shell, il définit respectivement les paramètres positionnels $1et $2to Usernameet user. Il expecty attribue autre chose. Laquelle devrait-elle faire?

Soit divisez votre script expect dans un fichier différent et appelez-le depuis le script shell, ou utilisez le fait qu'Expect s'exécute sur TCL qui devrait permettre de faire des boucles et des E / S en lui-même.


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

Alors, faites un script shell

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

et un script attendu à appeler à partir du script shell:

#!/usr/bin/expect -f 
set IP   [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...
ilkkachu
la source
1
@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 citations et des variables. C'est la manière la plus propre.
glenn jackman