| |
제 목 : 스위치장비 접속/명령용 expect 스크립트
작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
작성일 : 2006.1.24(화)
정리일 : 2006.2.3(금)
수정일 : 2006.2.9(목) Cajun 스위치 추가
expect는 telnet이나 ftp와 같이 인터랙티브한 환경이 필요한 곳에서 특정 문자열을 기다리고(expect),
정해진 문자열을 자동으로 보내는(send) 등의 처리를 하는 스크립트 언어이다.
이를 통해 telnet 과정과 이후의 명령을 자동으로 처리할 수 있다.
스위치 장비의 메모리사용량을 보거나 로그를 볼 때 딱 한줄의 명령만으로 접속과 결과를 확인할 수
있다면 편하지 않는가?
소개할 스크립트는 Foundry과 Summit, Cajun 스위치용으로 만든 것으로,
Foundry BigIron, ServerIron과 Summit L2, Cajun L3 장비에서 사용하고 있다.
1. 접속/명령용 스크립트
* 다운로드
http://coffeenix.net/truefeel/files/expect/show_foundry.exp.txt (Foundry 용)
http://coffeenix.net/truefeel/files/expect/show_summit.exp.txt (Summit 용)
http://coffeenix.net/truefeel/files/expect/show_cajun.exp.txt (Cajun 용)
아래는 Foundry용 스크립트이며, Summit, Cajun 용도 이와 비슷하므로 스크립트는 파일을 다운로드 받아
직접 확인하기 바란다.
| |
#!/usr/bin/expect --
#
# Foundry BigIron, ServerIron S/W 'show' command scripts
#
# Usage : ./show_foundry.exp <Password> <Enable Password> [Switch IP]
#
# 2006.1.24
# Made by 좋은진호(truefeel, http://coffeenix.net/ )
set timeout 1
set login [lindex $argv 0]
set enpass [lindex $argv 1]
set ip [lindex $argv 2]
set sleeptime 0.5
set prompt "스위치의 프롬프트를 적으세요."
set ipdefault "스위치IP를 적으세요."
# login password와 enable password 틀릴 때 Switch의 메시지
set login_errmsg "failure"
set en_errmsg "incorrect password"
# ------------------------------------------
# option 확인
if { $enpass == "" } {
send "Usage : ./show_foundry.exp <Password> <Enable Password> \[Switch IP\] \n\n"
exit
}
#
if { $ip == "" } {
set ip $ipdefault
}
# ------------------------------------------
# login
#
spawn telnet $ip
expect "Password:"
sleep $sleeptime
send "$login\r"
expect {
$prompt {
sleep $sleeptime
send "en\r"
} $login_errmsg {
sleep $sleeptime
send_user "\n\n\[Error\] invalid password \n"
exit
}
}
# enable password
expect "Password:"
sleep $sleeptime
send "$enpass\r"
expect $en_errmsg {
sleep $sleeptime
send_user "\n\n\[Error\] invalid enable_password \n"
exit
}
# ------------------------------------------
# command
set count 1
set cmd(1) "show clock"
set cmd(2) "show ip"
set cmd(3) "show cha"
set cmd(4) "show memory"
set cmd(5) "show version"
set cmd(6) "show who"
set cmd(7) "show stat"
set cmd(8) "show log"
set cmd(9) "show arp"
set cmd(10) "show int brief"
set cmd(11) "show server"
set cmd_cnt [array size cmd]
#
while { $count <= $cmd_cnt } {
expect $prompt
sleep $sleeptime
send "$cmd($count)\r"
set pause 1
while { $pause == 1 } {
expect "Control-c" {
sleep 0.2
send " "
} timeout {
set pause 0
}
}
incr count
}
# ------------------------------------------
# logout
expect $prompt
sleep $sleeptime
send "exit\r"
expect $prompt
sleep $sleeptime
send "exit\r"
interact
| |
사용방법은 다음과 같다.
| |
# ./show_foundry.exp <접속용 Password> <Enable Password> [Switch IP]
| |
3번째 IP는 입력하지 않으면 스크립트의 $ipdefault 변수에 정의된 IP로 접속을 한다.
스크립트는 간단하므로, 주요부분인 commmand 처리에 대해서만 설명을 하겠다.
각명령을 cmd() 배열에 저장을 하고, 배열개수를 cmd_cnt 변수에 저장해둔다.
while 문으로 cmd_cnt 개수만큼 하나씩 명령을 실행시킨다.
이 때 중요한 것은 결과가 많으면 pause상태가 되고 임의의 키를 누르면 다음 결과를 보여주는데,
이를 처리하는게 다음 부분이다.
| |
93 : set pause 1
94 : while { $pause == 1 } {
95 : expect "Control-c" {
96 : sleep 0.2
97 : send " "
98 : } timeout {
99 : set pause 0
100 : }
101 : }
| |
92번째줄 이전에서 지정한 명령이 실행이 되고,
93번째줄에서 일시정지 메시지("Control-c")를 기다리도록 1로 셋팅을 했다.
94번째줄 부터는 값이 1인 동안에는 expect 명령으로 일시정지 메시지가 나오는지 기다리게 된다.
만약 나오면 0.2초 후에 space를 2개 보낸다(space키를 2번 눌렀다고 이해하면 됨).
그러나 만약 "Control-c" 가 스크립트의 맨 처음에 설정한 1초동안(set timeout 1) 나오지 않는다면
timeout {} 안의 set pause 0 이 설정되어 while {} 문을 빠져 나오게 된다.
이렇게 처리하므로 일시정지 메시지가 1번 나올 때나, 여러번 나오올 때나 안나올 때나 능동적으로
반응을 하게 된다.
이 스크립트를 ./show_foundry.exp .... > 파일명 처럼 활용해서 결과를 파일로 저장할 수도 있으며,
cron에 등록하여 주기적으로 결과를 받아서 변화 추이를 파악해볼 수도 있다.
2. 참고 자료
* expect 프로그래밍 예 두번째 (글 좋은진호)
http://coffeenix.net/board_view.php?bd_code=115
* expect 프로그래밍 예 (글 좋은진호)
http://coffeenix.net/board_view.php?bd_code=112
|