“show version”명령 출력을 포착하기 위해 .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
telnet을 통해 $ IP에 저장된 IP에 연결되도록 for 루프를 완료해야합니다. “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를 변수로 다른 expect 스크립트에 어떻게 보낼 수 있습니까? (this 이것이 다른 질문과 “다르다고 생각하는 이유입니다.”
댓글
답변
#!/bin/bash #!/usr/bin/expect -f
음 … 아니요.
기본적으로 두 가지 모두 스크립트를 읽고 모든 줄에 대해 “올바른 일을”하는 프로그램. 인터프리터 간의 스크립트 실행 동기화 사이의 문제를 제외하고는 두 언어 모두에서 유효한 명령이 될 수있는 줄이있는 순간 이것이 불가능하다는 것을 쉽게 알 수 있습니다.
다음과 같은 것을 고려하십시오. 귀하의 예입니다.
set Username "user"
실제로 쉘과 expect 스크립트 모두에서 유효합니다. 셸에서 위치 매개 변수 $1
및 $2
를 Username
및
입니다. expect
에서는 다른 것을 할당합니다. 어떤 작업을해야합니까?
expect 스크립트를 다른 파일로 분할하고 쉘 스크립트에서 호출하거나 Expect가 자체적으로 루프 및 IO를 수행 할 수있는 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" ...
댓글
- @cesar, 쉘 스크립트 안에 expect 스크립트를 넣는 방법이 있지만 항상 인용과 변수에 골칫거리가 있습니다. 이것이 가장 깔끔한 방법입니다.
expect
가 unix.stackexchange.com/questions/350338/