bash и ожидать в том же сценарии?

9

Я пытаюсь закодировать скрипт, который берет IP-адреса из файла .csv и telnet устройства, чтобы перехватить вывод команды «show version».

Пока я закодировал это:

#!/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    

Мне нужно завершить цикл for, чтобы он подключался через telnet к IP-адресу, хранящемуся в $ IP, и сохранял вывод «show version».

Я пытался с этим:

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    

но это не сработало.

Это причина того, что я не могу использовать bash и ожидать?

В этом случае ... как я могу отправить $ IP и $ NUMDISP в качестве переменной в другой ожидаемый скрипт? (вот почему я думаю, что это отличается от другого вопроса)

Сезар Алехандро Виллегас Епез
источник
2
Не следует смешивать языки, expectможет прочитать файл CSV, как я показал в unix.stackexchange.com/questions/350338/...
thrig
@ thr ОП явно не чувствует, что это обман, так как они только что задали этот вопрос.
Тердон
Я задал оба вопроса, думаю, это немного отличается от других.
Сезар Алехандро Виллегас Епез

Ответы:

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

Ммм ... нет.

По сути, вы хотите, чтобы обе программы читали ваш сценарий и «делали правильные вещи» в отношении каждой строки. Помимо проблем между синхронизацией выполнения скрипта между интерпретаторами, легко увидеть, что это невозможно в тот момент, когда у нас есть строка, которая может быть допустимой командой на любом языке.

Рассмотрим что-то подобное в вашем примере.

set Username "user" 

Это действительно как в оболочке, так и в ожидаемом скрипте. В оболочке, она устанавливает позиционные параметры $1и $2к Usernameи user, соответственно. В expectнем назначается что-то еще. Какой это должно сделать?

Либо разделите ваш ожидаемый скрипт на другой файл и вызовите его из скрипта оболочки, либо используйте тот факт, что Expect работает на TCL, что должно позволять делать циклы и ввод-вывод сам по себе.


К счастью, в этом случае во втором блоке кода внутри цикла оболочки содержится только ожидаемый фрагмент.

Итак, сделайте скрипт оболочки

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

и ожидаемый сценарий для вызова из сценария оболочки:

#!/usr/bin/expect -f 
set IP   [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...
ilkkachu
источник
1
@cesar, есть способы поместить ожидаемый сценарий в сценарий оболочки, но всегда есть головная боль вокруг цитирования и переменных. Это самый чистый способ.
Гленн Джекман