3. OS이야기/03. Shell Script

[UNIX/LINUX] 자동화를 위한 interactive 스크립트 - expect (1) 기본 사용법

알 수 없는 사용자 2014. 5. 13. 15:13

이번 글에서는 자동화를 위해 유용하게 사용할 수 있는 expect 란 스크립트에 대해서 말씀 드리도록 하겠습니다.

 

expect 는 telnet이나 ftp와 같이 interactive한 환경이 필요한 곳에서 특정 문자열을 기다리고(expect), 정해진 문자열을 자동으로 보내는(send) 등의 처리를 하는 스크립트 언어입니다.

 

가령, A라는 서버에서 B라는 서버의 패스워드를 바꾸려 한다고 하면, telnet을 이용하여 B서버로 로그인하고 password 명령을 이용해 기존 패스워드와 새로운 패스워드를 차례로 입력하는 일련의 과정들을 거치게 됩니다.

 

하지만, 이 expect 를 이용하면 그런 절차들을 일일이 거칠 필요 없이 스크립트 하나만 돌림으로써 문제를 해결할 수 있습니다.

 

expect 스크립트를 사용하려면 bash나 ssh 등 여타 서비스들과 마찬가지로 시스템 상에 expect 모듈이 설치되어 있어야 하며, expect 설치 시에는 tcl과 tk 라는 두 가지 의존성을 가진 모듈이 함께 필요합니다.


(1) 기본 사용법

 

    a. 스크립트 선언


#!/bin/expect


bash나 ksh 등의 shell script 를 수행하기 위해서도 스크립트문 안에 위와 같이 선언을 해줘야 하듯, expect도 같은 방식으로 선언해 주어야 합니다.

 

expect 의 설치 위치가 bin 디렉토리 밑이 아니라면 bin 디렉토리 아래로 심볼릭 링크를 해주어야 합니다.

 

    b. target 시스템 설정


set target 192.168.63.1


해당 expect 스크립트를 수행할 target 시스템을 설정하는 부분입니다.

 

    c. 실행할 서비스 설정


spawn telnet $target



어떤 서비스를 이용하여 target 시스템에 접근할 것인지를 설정하는 부분으로, spawn 명령은 상호대화(interactive)할 프로그램을 띄우기 위한 목적으로 사용합니다.

 

    d. 예상되는 문구 설정


expect [-re] 예상문구                 // ex. expect -re "login:"



위에 나열한 순서로 target 시스템에 telnet 접근했을 때, 제일 먼저 뜨는 것은 ' login: ' 이라는 문구일 것입니다.

 

그러한 경우에 옆에 주석으로 달아놓은 것처럼 expect -re "login:" 이라고 설정하면 됩니다.

 

-re 옵션은 정규 표현식(regular expression)을 위해 사용합니다.

 

가령, expect -re "a*" 라고 설정하였다면, a, aa, aaa, aaaa, ... 등의 문자열과는 매치(match)하지만 ab, ac 등의 문자열과는 매치하지 않고,

 

expect "a*" 라고 설정하였다면, aa, ab, ac 등과 같은 문자열과 매치합니다.

 

    e. 원하는 값 보내기


send 원하는 값                           // ex. send "root"



예상되는 문구가 정상적으로 스크립트에서 인지되었다면 인제 그에 맞는 값을 target 시스템에 던져야겠죠?

 

target 시스템에 root로 로그인하고자 한다면 위와 같이 send "root" 라고 설정하면 됩니다.

 

    f. delay time 설정


sleep 자연수



시스템마다 조금씩 차이가 있는 것이 telnet을 이용하여 시스템에 접속하고 login 계정을 입력한 후 엔터를 치면, password 입력 프롬프트가 바로 안 나오고 1~2초 후에 보이는 경우가 있습니다.

 

그런 시스템에서 이 sleep 명령을 주지 않고 expect 다음에 send 명령을 바로 사용하면 멍~ 때리는 현상이 발생하게 됩니다.

 

예상되는 문구가 뜨기도 전에 target 시스템에 문자열을 날려 버리기 때문이지요.

 

expect 라는 자동화 스크립트의 특성상 한번 그렇게 문자열이 앞당겨져서 날라가게 되면 다음에 나오는 명령들도 줄줄이 앞당겨져서, 예상문구를 기다리지도 않고 날라가게 됩니다.

 

그러면 스크립트가 더 이상 수행되지 않고 멍 때리는 현상이 발생하지요.

 

그러므로 expect 스크립트에선 어떤 시스템에도 종속되지 않게 sleep 을 잘 사용하여 표준화하는 것이 중요합니다.

 

이러한 expect 스크립트에 대한 자료는 구글링을 아무리 해도 많지 않기에 expect 스크립트를 사용하시려는 분들께 도움이 되었으면 합니다.

 

다음 글에서는 예제를 통해 더 자세히 살펴보도록 하겠습니다.