bash와 Expect가 같은 스크립트에 있나요?

bash와 Expect가 같은 스크립트에 있나요?

.csv 파일에서 IP 주소를 가져오고 텔넷 장치를 통해 "버전 표시" 명령 출력을 캡처하는 스크립트를 작성하려고 합니다.

지금까지 내가 코딩한 내용은 다음과 같습니다.

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

$IP에 저장된 IP에 텔넷을 통해 연결하고 "버전 표시" 출력을 저장하도록 for 루프를 완료해야 합니다.

나는 이것을 시도했습니다 :

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를 다른 예상 스크립트에 변수로 보낼 수 있나요? (그래서 다른 질문과 다르다고 생각합니다)

답변1

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

음 .. 아니야.

기본적으로 두 프로그램 모두 스크립트를 읽고 각 줄에 대해 "올바른 작업"을 수행하기를 원합니다. 인터프리터 간의 스크립트 실행 동기화 문제 외에도 두 언어 모두에서 유효한 명령이 될 수 있는 줄이 있으면 이것이 어떻게 불가능하다는 것을 쉽게 알 수 있습니다.

귀하의 예에서 이와 같은 것을 고려하십시오.

set Username "user" 

실제로 쉘과 Expect 스크립트 모두에서 작동합니다. 셸에서는 $1위치 매개변수 및 를 각각 $2으로 설정합니다 . 그것에 할당된 다른 것들이 있습니다 . 어느 것을 해야 할까요?Usernameuserexpect

Expect 스크립트를 여러 파일로 분할하고 쉘 스크립트에서 호출하거나 Expect가 TCL에서 실행된다는 사실을 활용하세요. 그러면 루프와 IO가 자체적으로 수행될 수 있습니다.


다행히 이 경우 두 번째 코드 블록의 셸 루프에는 Expect 조각만 포함되어 있습니다.

그래서 쉘 스크립트를 만들어 보세요.

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

관련 정보