bash dan harapkan dalam skrip yang sama?

9

Saya mencoba kode skrip yang mengambil alamat IP dari file .csv dan telnet perangkat untuk menangkap output "show version" perintah.

Sejauh ini saya telah mengode ini:

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

Saya perlu menyelesaikan loop for sehingga terhubung melalui telnet ke IP yang disimpan di $ IP dan menyimpan output "show version".

Saya sudah mencoba ini:

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    

tapi itu tidak berhasil.

Apakah ini penyebab saya tidak dapat menggunakan bash dan mengharapkan?

Jika itu alasannya .. bagaimana saya bisa mengirim $ IP dan $ NUMDISP sebagai variabel ke skrip harapan yang berbeda? (ini sebabnya saya pikir ini berbeda dari pertanyaan lain)

Cesar Alejandro Villegas Yepez
sumber
2
Jangan campur bahasa, expectdapat membaca file CSV, seperti yang saya perlihatkan di unix.stackexchange.com/questions/350338/…
thrig
@ thrig OP jelas tidak merasa itu penipuan karena mereka baru saja menanyakan pertanyaan ini.
terdon
Saya membuat kedua pertanyaan, saya pikir ini sedikit berbeda dari yang lain.
Cesar Alejandro Villegas Yepez

Jawaban:

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

Umm ... tidak.

Pada dasarnya Anda ingin kedua program membaca skrip Anda, dan "melakukan hal yang benar" mengenai setiap baris. Terlepas dari masalah antara sinkronisasi eksekusi skrip antara penerjemah, mudah untuk melihat ini tidak mungkin saat kita memiliki garis yang bisa menjadi perintah yang valid dalam bahasa apa pun.

Pertimbangkan sesuatu seperti ini dalam contoh Anda.

set Username "user" 

Ini sebenarnya valid di shell dan di script yang diharapkan. Di shell, ia menetapkan parameter posisi $1dan $2untuk Usernamedan usermasing-masing. Di expectdalamnya menetapkan sesuatu yang lain. Yang mana yang harus dilakukan?

Pisahkan skrip harapan Anda ke file yang berbeda dan panggil dari skrip shell, atau gunakan fakta bahwa Harapkan berjalan pada TCL yang seharusnya memungkinkan melakukan loop dan IO sendiri.


Untungnya dalam kasus ini, hanya ada cuplikan harapan yang terkandung dalam lingkaran shell di blok kode kedua Anda.

Jadi, buat skrip shell

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

dan skrip harapan untuk dipanggil dari skrip shell:

#!/usr/bin/expect -f 
set IP   [lindex $argv 0];
spawn telnet $IP
expect "Username:"
send "$Username\r"
...
ilkkachu
sumber
1
@cesar, ada cara untuk menempatkan skrip ekspektasi di dalam skrip shell, tetapi selalu ada sakit kepala di sekitar kutip dan variabel. Ini cara terbersih.
glenn jackman