Computer/LINUX

expect

알찬돌삐 2012. 8. 10. 16:15

가끔 그런 고민을 하게 됩니다..

일정시간 별로 Shell로 다른 서버에 접속해서..

작업을 해준 다면 좋겠다 라고요...

예를 들어 SHELL로 FTP 파일을 전송하고..

그 다음에는 TELNET으로 접속해 압축을 풀고..

그 파일을 실행 시켜준다면 좋겠다 라고요...

서버 두대에서 각자 크론을 돌리신다고요?

그것도 좋은 방법이긴 하죠..

하지만 FTP전송이 끝나기 전에 크론이 돌아가면 어쩌죠?

시간 스케쥴링을 잘못한다면 말이죠...

그래서 나온것인지 모르겠찌만...EXPECT라는 쉘이 있습니다..

이것을 이용하면 원격 TELNET을 SHELL로 가능하게 할 수 있지요..

대충 사용법만 보면 아실 것 같아..

제가 이전에 짜 두었던...

스크립트를 올려보도록 하겠습니다.

File 1. BmTelnet

#!/usr/local/bin/expect -f
set timeout -1
spawn telnet 서버아이피(또는 도메인)
expect -re "login: "
sleep 1
send "userid\r"
expect -re "biz's Password:"
sleep 1
send "password\r"
send "ls\r"
interact

이렇게 만들어 두고..

./BmTetlnet이라고 실행해 보세요..

오홋!! 신기하죠?

접속해서 ls까지 치고 나왔습니다..ㅎㅎ

이정도면 되겠지요?

Shell 스크립트를 다른 서버에 미리 만들어 두던가,.

아니면 여기서 명령을 쳐서 원하는 작업을 할 수 있습니다.

이제 여러분은!! 여러대의 서버를 한번에 조작할 수 있는 Shell을 만들 수 있습니다.

2대 3대의 서버를 일정 시간 한번씩 동기화 시키기도 편하고요..

그 여러대 서버를 Shell하나로 쉽게 관리 할 수 있습니다.^^

 

 

 

Synopsis 

expect [ -dDinN ] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

Usage 

 

#!/usr/local/bin/expect -f

script 파일에 포함할 때 위 구문으로 시작
/usr/local/bin/expect에는 expect가 설치된 정확한 위치 지정.

  • -c : script 실행전에 수행해야할 command 지정
  • -d :
  • -D : 디버그 모드 실행.
  • -f : 파일로 부터 실행 구문을 읽어들임.
  • -i : expect shell(? prompt방식). 나갈때는 exit
  • -v : 버전 정보

Commands

close [-slave] [-onexec 0|1] [-i spawn_id] 

현재 프로세스의 연결 폐쇄. expect, interact 는 현재 프로세스가 종료되면 내부적으로 close를 호출

  • -i : spawn_id 에 해당하는 프로세스 폐쇄
  • -slave : spawn_id에 연결된 slave도 함께 폐쇄

 

 

debug [[ -now ] 0|1] 

disconnect 

fork된 프로세스를 터미널과 분리시킴.(background로 실행시키는 것과 같은 효과. 프로세스를 &로 실행시키버리면 터미널과 분리된 채 Expect와 연결되기 때문에 Expect에서는 더이상 제어를 할수 없게 된다.)

exit [-opts] [status] 

Expect 종료

exp_continue [-continue_timer] 

expect가 return 되지 않고 계속 실행되도록 한다.

  • -continue_timer : exp_continue가 호출되면 timeout설정이 reset되는데 이러한 재설정을 막는다.

 

 

exp_internal [-f file] value 

  • value = 1 : 진단정보를 stderr로 전송
  • value = 0 : 진단정보 전송하지 않음
  • -f : 진단정보 파일로 전송

exp_open [args] [-i spawn_id] 

Tcl의 open명령과 유사하게 동작

exp_pid [-i spawn_id] 

spawn된 프로세스의 pid반환

exp_version [[-exit] version] 

expect [[-opts] pat1 body1] ... [-opts] patn [bodyn] 

일치된 패턴을 만날 때 까지 기다린다.

  • eof : end-of-file일 때
  • timeout : timeout되었을 때
  • default : eof 와 timeout을 합쳐놓은 패턴

패턴과 일치되면 패턴과 연결된 구문이 실행되고 구문의 결과를 반환. 일치되는게 없다면 빈문자열. 여러개가 일치된다면 첫번째 패턴이 선택됨.
패턴은 매칭

  • default : Tcl string match
  • -re : Tcl's regexp
  • -ex : exact string
  • -nocase : 대소문자 구문없이 모두 소문자로 비교

 

expect_after [expect_args] 

expect_background [expect_args] 

기다림없이 바로 return되며 새로운 입력이 발생할 때마다 패턴 매칭을 수행. timeout, default 키워드가 의미 없음.

expect_before [expect_args] 

expect보다 먼저 패턴 매칭 수행

expect_tty [expect_args] 

expect와 같으나 /dev/tty(사용자입력)로부터 입력을 받는다.

expect_user [expect_args] 

expect와 같으나 stdin(사용자입력)로부터 입력을 받는다.

fork 

프로세스 생성

interact [string1 body1] ... [stringn [bodyn]] 

 

현재프로세스의 제어권을 사용자에게 넘김.
아래같이 하면 Ctrl+c 입력하면 Expect 종료

set CTRLZ \032
interact {
-reset $CTRLZ {exec kill -STOP [pid]}
\001 {send_user "you typed a control-A\n";
send "\001"
}
$ {send_user "The date is [exec date]."}
\003 exit
foo {send_user "bar"}
~~
}

 

 

 

 

 

Expect의 시작 #

shell에서 expect로 진입 exit로 종료
expect script가 파일로 존재한다면
expect 파일명 을 통해 실행 가능.
expect script 파일은
-f
로 시작해야 한다.

  • spawn : expect 프로세스 시작.
    첫번째 파라미터는 실행할 프로그램 명
    두번째 파리미터는 전달할 인자
  • send : 생성된 프로세스에 command 전달
    send "hello world"
    Expect가 아직 interact하지 않다면 stdout에 출력.
  • expect : 프로세스로 부터 문자열을 기다림.
    기본으로 stdin, 즉 키보드 입력을 기다린다.
    match하는 문자열이 없다면 더 많은 문자가 입력되길 기다린다. 무조건 기다린다 match되는걸 찾게 되거나 timeout이 날때 까지. 기본 timeout은 10초이다.
    set timeout 60
    Tcl에서 위와 같이 사용하면 timeout 시간이 60초로 변경된다. -1 이라면 영원히 기다리고 0이면 기다리지 않는다.
    정규표현식 :
    ^ : 이문자로 시작해야 찾는다
    ^hi 라면 hiccup (o) sushi (x)
    $ : 이문자로 끝나야 찾는다.

관련 site
[http]Expect - A Tool for Regression Testing

 

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > LINUX' 카테고리의 다른 글

mrtg  (0) 2012.08.10
커널 파라메터  (0) 2012.08.10
삼바 서버 설정  (0) 2012.08.10
분할 압축  (0) 2012.08.10
디버깅 툴  (0) 2012.08.10