가끔 그런 고민을 하게 됩니다..
일정시간 별로 Shell로 다른 서버에 접속해서..
작업을 해준 다면 좋겠다 라고요...
예를 들어 SHELL로 FTP 파일을 전송하고..
그 다음에는 TELNET으로 접속해 압축을 풀고..
그 파일을 실행 시켜준다면 좋겠다 라고요...
서버 두대에서 각자 크론을 돌리신다고요?
그것도 좋은 방법이긴 하죠..
하지만 FTP전송이 끝나기 전에 크론이 돌아가면 어쩌죠?
시간 스케쥴링을 잘못한다면 말이죠...
그래서 나온것인지 모르겠찌만...EXPECT라는 쉘이 있습니다..
이것을 이용하면 원격 TELNET을 SHELL로 가능하게 할 수 있지요..
대충 사용법만 보면 아실 것 같아..
제가 이전에 짜 두었던...
스크립트를 올려보도록 하겠습니다.
File 1. BmTelnet
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 : 버전 정보
close [-slave] [-onexec 0|1] [-i spawn_id]
현재 프로세스의 연결 폐쇄. expect, interact 는 현재 프로세스가 종료되면 내부적으로 close를 호출
- -i : spawn_id 에 해당하는 프로세스 폐쇄
- -slave : spawn_id에 연결된 slave도 함께 폐쇄
disconnect
exp_continue [-continue_timer]
expect가 return 되지 않고 계속 실행되도록 한다.
- -continue_timer : exp_continue가 호출되면 timeout설정이 reset되는데 이러한 재설정을 막는다.
exp_pid [-i spawn_id]
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_background [expect_args]
expect_tty [expect_args]
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
Expect - A Tool for Regression Testing
이 글은 스프링노트에서 작성되었습니다.