| expect 프로그래밍 예 | 작성일 : 2003/10/30 02:10 |
| 조회수 : 21083 |
|
97년에 나우누리 리눅스동호회에 소인이 쓴 글입니다. 지금은 의미없는 expect 스크립트지만, expect의 활용을 잘 보여주고 있습니다. 저만의 생각일까요? ^^ 수정없이 그대로 올립니다. ------------------------------------------------------------------- [1643] 제목 : [팁] 채팅족(?)을 위한 expect 활용 올린이 : bluefine(..진호) 97/05/20 00:25 읽음 : 243 관련자료 없음 ------------------------------------------------------------------------------ 채팅하시는 분을 위해 expect 를 이용한 script 를 짜 봤습니다. 대부분의 사람들(채팅을 안하시는 분들)에게는 아래의 script 가 필요가 없을 듯 싶네요. 그래도 expect 쓰시는, 혹은 쓰고 싶은 분은 한 번 봐 보세요. 리눅스동에는 채팅족(?) 들이 많다는 것을 느꼈습니다. 밤부터 새벽, 혹은 아침까지 하시는 분들도 계시더군요. 저도 몇 번은 했습니다. 원래 저는 채팅을 거의 하지 않습니다. 어쩌다 사람 만나고, 질문에 대한 답변을 해주기 위한 경우(대화방으로 초청을 한 경우)에나 합니다. 항상 하는 분들이 계속 채팅을 하시더군요. 그리고 제 눈치(? 왠 눈치까지) 로는 누가 접속을 했는지 조사를 하여 채팅을 하는 사람들도 있는 것 같아요. 그래서 expect 로 간단한 script 를 만들어 봤습니다. expect 공부도 할겸. 우선 script 내용입니다. >-----------------------자르세요. -----------------------------< #!/usr/bin/expect -- # # ------------------------------------------------------------- # 사용자 접속 조사, 개설된 대화방 조사 script # ------------------------------------------------------------- # -n : 사용자 접속은 조사 안함 # 접속한 내용이 ~/nowlog 에 저장됩니다. # 필요없을 때는 comment(앞에 #) 해주세요. log_file ~/nowlog set BELL \007 set nopfchk 0 proc pfchk {} { send "pf 검사할 ID\r" expect -re "최근" { expect_user "zz" { send_user " 정상상태(interact)로 왔습니다.\n" break } } -re "현재" { send_user \007 } } # ------------------------------------------- # 옵션 검사 # -n : pf 체크를 하지 않습니다. # ------------------------------------------- while { $argc } { set option [lindex $argv 0] switch -- $option \ "-n" { set nopfchk 1 incr argc -1 } default { break } } # ------------------------------------------- # 나우누리에 접속을 합니다. # ------------------------------------------- spawn telnet -8 now expect "Enter" sleep 1 send "\r" expect -re "나 우 ID :" sleep 1 send "당신의ID\r" expect -re "비밀번호 :" sleep 1 send "당신의 passwd\r" expect -re "선택>" send "go linux\r" expect -re "Enter" sleep 1 send "\r" # ------------------------------------------- # 사용자 접속 조사, 개설된 대화방 조사 # # - 15 초 간격으로 30분 동안 검사합니다. # - 찾는 사람이 접속을 했으면 "삐" 소리를 # 내며 계속 개설된 대화방을 찾는다. # - 개설된 대화방이 있으면 빠져나간다. # - interact 모드로 가려면 zz 를 누른다. # ------------------------------------------- expect -re "선택>" sleep 1 for {set num 0} {$num < (40*3)} {incr num} { # pf 명령어로 접속 상황 조사 # if { $nopfchk != 1 } { pfchk } # 개설된 대화실 조사 # sleep 5 send "4\r" expect -re "없습니다" { expect_user "zz" { send_user " 정상상태(interact)로 왔습니다.\n" send "p\r" break } send "p\r" } -re "공개 " { send_user $BELL send_user $BELL break } sleep 10 } interact >-----------------------자르세요. -----------------------------< '당신의ID' 와 '당신의 passwd' 에 각각 접속자의 ID, passwd 를 넣으세요. 그리고 '검사할 ID' 에는 접속을 했는지 찾고 싶은 분의 ID를 입력하면 됩니다. 위의 script 는 30분 동안 15초 간격으로 계속 찾고자 하는 분이 접속을 했는지 대화방이 개설이 되어 있는지 체크를 합니다. 찾는 사람이 접속을 했으면 '삐' 소리를 한 번, 대화방이 개설되었으면 '삐' 소리를 두 번 냅니다. 그리고 중간에 검사를 마치고 싶으면 'zz' 를 누른 후 엔터를 치면됩니다. 약간의 문제가 있긴하나 interact 모드로 들어갑니다. -n 옵션은 접속한 사람을 찾는 것을 하지 않을 때 쓰는 옵션입니다. script를 설명하겠습니다. proc pfchk {} { send "pf 검사할 ID\r" expect -re "최근" { expect_user "zz" { send_user " 정상상태(interact)로 왔습니다.\n" break } } -re "현재" { send_user \007 } } proc pfchk {} 는 접속자를 찾는 프로시저입니다. 호출은 pfchk 라고 하면 됩니다. send : 통신망으로 내용을 보낸다. send_user : 통신망으로 보내지 않고 화면으로만 보낸다. expect : 통신망으로 부터 들어온 문자를 기다린다. expect_user : 사용자로 부터 들어온 문자를 기다린다. 위의 경우 pf 명령를 한 후 '최근' 이라는 글자가 들어오면 'zz' 라는 글자가 입력이 되었으면 빠져나가는 것입니다. '현재'라는 글자가 들어오면 '삐'소리를 한 번 내게 됩니다. pf 명령를 쓰시면 무슨 말인지 아실 겁니다. while { $argc } { set option [lindex $argv 0] switch -- $option \ "-n" { set nopfchk 1 incr argc -1 } default { break } } 입력된 옵션을 찾는 것입니다. switch 는 sh script 의 case 와 같은 것입니다. -n 옵션이 입력되면 nopfchk=1 을 입력하고 이 것이 나중에 if 문에 의해 pf 명령어를 쓰지 않도록하는 것이죠. incr argc -1 은 입력된 다음 매개변수를 읽도록 합니다. 없으면 while {} 을 빠져 나가죠. 나우누리 접속관련 script 부분은 설명하지 않겠습니다. 여기 게시판에 lt expect 하여 찾아보시면 만용님의 글이 있으니 꼭 읽어보시기 바랍니다. for {set num 0} {$num < (40*3)} {incr num} { # pf 명령어로 접속 상황 조사 # if { $nopfchk != 1 } { pfchk } # 개설된 대화실 조사 # sleep 5 send "4\r" expect -re "없습니다" { ~~~~~ 생략합니다. ~~~~~ } -re "공개 " { send_user $BELL send_user $BELL break } sleep 10 } interact for {set num 0} {$num < (40*3)} {incr num} 은 num=0 부터 num < (40*3) 까지 1 씩 증가하는 for 문입니다. 40*5하면 50분동안 검사를 합니다. if 문에 의해 nopfchk=1 이면 pf 검사를 하지 않습니다. pf 체크 5초가 지난 뒤에 개설된 대화방을 찾습니다. 이 부분은 pf 체크와 거의 같습니다. 그래서 생략합니다. 단지 send_user $BELL 을 두 번하여 '삐' 소리를 두 번 내 뿐입니다. 대화방 검사 후 10초 후에 다시 pf 체크를 합니다. 이상입니다. expect 프로그램이 없으신 분은 우선 자료실에서 expect 1.2 와 tk/tcl lib 를 받으시고 설치하시기 바랍니다. 여기 있는 script 는 /usr/doc/examples/expect 에 파일을 참고 했으며, man expect 도 참고했습니다. O'reilly 사에서 책도 나와있는데 expect 공부하실 분은 한 번 사서 보세요. 문제가 있으면 스스로 고치세요. expect 에 대해 잘 모르셔서 못 고치시면 메일로 알려주세요. 이 script가 유용할 사람이 있을까? |
|||||||||
|
|