.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
으로 설정합니다 . 그것에 할당된 다른 것들이 있습니다 . 어느 것을 해야 할까요?Username
user
expect
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"
...