커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 프로그래밍 / 개발 도움말
검색 : 사이트 WHOIS 웹서버 종류

웹 프로그래밍 / PHP (19, 글 13, 자료 15)
프로그래밍 툴 / IDE (12, 자료 3)
라이브러리 (3)
C, C++ (10, 자료 11)
Java(자바) (13, 글 1, 자료 5)
Python (파이썬) (5, 자료 2)
쉘 프로그래밍(shell script, 셀) (8, 글 3, 자료 4)
오픈소스 / 프로젝트 (2)
Perl (펄) (7, 자료 3)
임베디드(embedded) (8, 글 1, 자료 6)
버전관리 / CVS (8, 글 1, 자료 3)
포팅 / 마이그레이션 (1, 자료 1)
Assembly (어셈블리) (3, 자료 1)
디버깅, 디버그(debug), 디버거 (4, 글 1, 자료 3)
XML (2)
기타언어 (2, 자료 1)
모바일(mobile, wap) (2, 자료 1)

  expect 프로그래밍 예 작성일 : 2003/10/30 02:10
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 12205
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      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가 유용할 사람이 있을까?
      커피닉스 카페 최근 글
    [01/26] Re: wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/25] wget으로 다른서버에있는 디렉토리를 가져오려고합니다.
    [01/11] 특정 안드로이드 WebView 버전에서 SSL 문제 (WebView 버그)
    [08/01] DNS forwarder (전달자) 서버를 통해서 쿼리하면 역방향을 받아오질 못합니다.
    [05/16] (주)후이즈 시스템엔지니어 (경력자) 모집
    [02/15] [AWS] Cloudfront edge 확인하기
    [01/20] Mobile Service/eCommerce 기업에서 Server / Java / PHP 개발자 구인
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Mobile 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Web Front 개발자를 모십니다.
    [01/11] 탄탄한 퍼블리싱 모바일기업에서 Server 개발 팀장을 모십니다.
    [12/21] 브라우저별 SHA1 퇴출 시점
    [09/15] [구인] 시스템엔지니어 (경력)
    [08/05] Re: 칼리리눅스 텔넷관련
    [08/04] 칼리리눅스 텔넷관련
    [06/29] 또 다른 무료 SSL 인증서, Let's Encrypt
      New!   최근에 등록한 페이지
      KiCad EDA Suite project (Free/Libre/Open-Source EDA Suite) (CAD)
      오픈캐스케이드 캐드 (OpenCASCADE CAD)
      QCad for Windows --- GNU GPL (Free Software)
      The Hello World Collection
      IPMI를 활용한 리눅스 서버관리
      DNS 설정 검사
      nagiosgraph 설치 방법
      Slony-I 설치 방법 (postgresql replication tool)
      Qmail기반의 Anti spam 시스템 구축하기
      clusterssh

    [ 함께하는 사이트 ]




    운영진 : 좋은진호(truefeel), 야수(yasu), 범냉이, sCag
    2003년 8월 4일~