bash và mong đợi trong cùng một kịch bản?


9

Tôi đang cố mã hóa tập lệnh lấy địa chỉ IP từ tệp .csv và telnet thiết bị để bắt đầu ra lệnh "hiển thị phiên bản".

Cho đến nay tôi đã mã hóa điều này:

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

Tôi cần hoàn thành vòng lặp for để nó kết nối qua telnet với IP được lưu trữ ở $ IP và lưu đầu ra "phiên bản hiển thị".

Tôi đã thử với điều này:

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    

nhưng nó không hoạt động.

Đây có phải là nguyên nhân tôi không thể sử dụng bash và mong đợi?

Trong trường hợp đó là lý do .. làm cách nào tôi có thể gửi $ IP và $ NUMDISP dưới dạng một biến thành một tập lệnh kỳ vọng khác nhau? (đây là lý do tại sao tôi nghĩ nó khác với câu hỏi khác)


2
Không trộn lẫn các ngôn ngữ, expectcó thể đọc tệp CSV, như tôi đã trình bày trong unix.stackexchange.com/questions/350338/ Kẻ
thrig


@thrig OP rõ ràng không cảm thấy đó là một bản dupe vì họ vừa hỏi câu hỏi này.
terdon

Tôi đã làm cả hai câu hỏi, tôi nghĩ rằng điều này là một chút khác nhau so với câu hỏi khác.
Cesar Alejandro Villegas Yepez

Câu trả lời:


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

Ừm ... không.

Về cơ bản, bạn muốn cả hai chương trình đọc kịch bản của bạn và "làm điều đúng đắn" liên quan đến mọi dòng. Ngoài các vấn đề giữa quá trình đồng bộ hóa việc thực thi tập lệnh giữa các trình thông dịch, dễ dàng nhận thấy điều này là không thể ngay lúc chúng ta có một dòng có thể là một lệnh hợp lệ trong cả hai ngôn ngữ.

Hãy xem xét một cái gì đó như thế này trong ví dụ của bạn.

set Username "user" 

Nó thực sự hợp lệ trong cả shell và trong một kịch bản mong đợi. Trong vỏ, nó đặt các thông số vị trí $1$2để Usernameuser, tương ứng. Trong expectđó chỉ định một cái gì đó khác. Nên làm cái nào?

Hoặc chia tập lệnh mong đợi của bạn thành một tệp khác và gọi nó từ tập lệnh shell hoặc sử dụng thực tế là Expect chạy trên TCL, thứ sẽ cho phép tự thực hiện các vòng lặp và IO.


May mắn thay trong trường hợp này, chỉ có một đoạn mong đợi được chứa trong một vòng lặp shell trong khối mã thứ hai của bạn.

Vì vậy, tạo một kịch bản shell

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

và một tập lệnh mong đợi để gọi từ tập lệnh shell:

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

1
@cesar, có nhiều cách để đặt tập lệnh mong đợi bên trong tập lệnh shell, nhưng luôn có những vấn đề đau đầu xung quanh việc trích dẫn và biến. Đây là cách sạch nhất.
glenn jackman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.