2008. 4. 6.

Linux expect command example

리눅스 expect 명령 간단한 예제 (2)
작성한 스크립트는 각 원격 시스템들을 로그인 하여 간단하게 프로세스을 죽이고 살리는 스크립트이다.
좀 더 구체적으로 말하자면 7대의 시스템이 A라는 서비스를 하고 있었는데 이를 B라는 서비스로 바꾸고
싶을 때 자동으로 Telnet 원격 로그인을 치고 들어가서 프로세스를 죽이고 살리는 작업을 한다.

switch_mode.sh 스크립트
1) 변수 사용 (앞 부분)

#!/usr/bin/expect
#
# @file : switch_mode.sh
# @description : switch between pac and iux automatically
# @author : Keywon Ryu
# @date : 2008. 01. 18
#
#

set timeout 180 # timeout 값 설정 (send를 하고 expected된 응답이 안 올때의 timeout)
set system [lindex $argv 0] # ./switch_mode $0 (콘솔에서 실행 시의 첫 인자)


2) 함수 정의
4개의 함수를 구현하였다.
- start_pac : 시스템에 PAC 서비스를 구동시킨다.
- stop_pac : 시스템에 PAC 서비스를 종료한다.
- start_iux : 시스템에 IUX 서비스를 구동시킨다.
- stop_iux : 시스템에 IUX 서비스를 종료한다.
함수 예제)

#----------------------------------------------------------------
# Args : host (IP address)
# Desc : 해당 IP 주소 시스템의 IUX 서비스를 구동시킨다.
#----------------------------------------------------------------
proc start_iux host {
# 해당 호스트에 telnet 로그인
spawn telnet -l iux -c $host
expect -re "Password:"
sleep 0.5
send "암호\r"
expect -re "Last login:"
sleep 0.5

# startPFM 명령 실행 (자체적으로 서비스 framework을 실행시키는 실행 파일이다.)
send "startPFM\r"

# 12초간 wait
sleep 12

# startIUX 명령 실행 (자체적으로 IUX 서비스를 실행시키는 실행 파일이다.)
send "startIUX\r"

# 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
expect -re "lucyPAC : Logout from UAS..."

# 로그 아웃
send "exit\r"
interact
}

#----------------------------------------------------------------
# Args : host (IP address)
# Desc : 해당 IP 주소 시스템의 IUX 시스템을 종료시킨다.
#----------------------------------------------------------------
proc stop_iux host {
# 해당 호스트에 telnet 로그인
spawn telnet -l iux -c $host
expect -re "Password:"
sleep 0.5
send "암호\r"
expect -re "Last login:"
sleep 0.5

# stopIUX 명령 실행 (자체적으로 IUX 서비스을 종료시키는 실행 파일이다.)
send "stopIUX -a\r"

# 명령을 실행 시 다음의 문자열이 올 때까지 대기한다
expect -re "Do you really want to stop Process"

# stopIUX 명령에서 Do you really want to stop Process CHT11? (y/n/a/q) 이렇게 물어보며
답을 기다리게 된다. 이 답에 대해 'a'를 자동으로 보낸다.
send "a\r"

# 명령이 종료되었음을 알리는 문자열이 올 때까지 대기한다.
expect -re "lucyPAC : Logout from UAS..."

# stopPFM 명령 실행 (자체적으로 서비스 framework을 종료시키는 실행 파일이다.)
send "stopPFM\r"

# 5 초간 기다린다.
sleep 5
send "exit\r"
interact
}


3) 본문 구성

[변수 사용]
[함수 정의]
..................
if { $system != "pac" && $system != "iux" } {
send "SWTICH> not supported system. between 'pac' and 'iux'\n"
send "SWITCH> example) ./switch_mode pac\n"
send "SWITCH> example) ./switch_mode iux\n"
send "\n"
exit
}
send "SWITCH> $system switch_mode starting.....\n"
send "\n"

if { $system == "pac" } { # PAC 서비스로 변신
# IUX 서비스들을 종료
stop_iux "192.168.1.1"
stop_iux "192.168.1.2"
......................
stop_iux "192.168.1.7"

# PAC 서비스들을 구동
start_pac "192.168.1.1"
start_pac "192.168.1.2"
.......................
start_pac "192.168.1.7"
}
if { $system == "iux" } { #IUX 서비스로 변신
# PAC 서비스들을 종료
stop_pac "192.168.1.1"
stop_pac "192.168.1.2"
......................
stop_pac "192.168.1.7"

# IUX 서비스들을 구동
start_iux "192.168.1.1"
start_iux "192.168.1.2"
.......................
start_iux "192.168.1.7"
}

댓글 없음: