커피닉스, 시스템 엔지니어의 쉼터 커피향이 나는 *NIX
커피닉스
시스템/네트웍/보안을 다루는 곳
* HanIRC의 #coffeenix 방
[ 장비 및 회선 후원 ]
HOME > 네트워크(network) > 장비 / 라우터 / 스위칭 도움말
검색 : 사이트 WHOIS 웹서버 종류


  스위치장비 접속/명령용 expect 스크립트 작성일 : 2006/02/04 15:33
 
  • 글쓴이 : 좋은진호 ( http://coffeenix.net/ )
  • 조회수 : 16349
          [ 이전화면 / 수정 ]   비밀번호 :     인쇄용 화면
      제  목 : 스위치장비 접속/명령용 expect 스크립트
    작성자 : 좋은진호(truefeel, http://coffeenix.net/ )
    작성일 : 2006.1.24(화)
    정리일 : 2006.2.3(금)
    수정일 : 2006.2.9(목) Cajun 스위치 추가

    expect는 telnet이나 ftp와 같이 인터랙티브한 환경이 필요한 곳에서 특정 문자열을 기다리고(expect),
    정해진 문자열을 자동으로 보내는(send) 등의 처리를 하는 스크립트 언어이다.
    이를 통해 telnet 과정과 이후의 명령을 자동으로 처리할 수 있다.
    스위치 장비의 메모리사용량을 보거나 로그를 볼 때 딱 한줄의 명령만으로 접속과 결과를 확인할 수
    있다면 편하지 않는가?

    소개할 스크립트는 Foundry과 Summit, Cajun 스위치용으로 만든 것으로,
    Foundry BigIron, ServerIron과 Summit L2, Cajun L3 장비에서 사용하고 있다.

    1. 접속/명령용 스크립트

    * 다운로드
      http://coffeenix.net/truefeel/files/expect/show_foundry.exp.txt (Foundry 용)
      http://coffeenix.net/truefeel/files/expect/show_summit.exp.txt (Summit 용)
      http://coffeenix.net/truefeel/files/expect/show_cajun.exp.txt (Cajun 용)

    아래는 Foundry용 스크립트이며, Summit, Cajun 용도 이와 비슷하므로 스크립트는 파일을 다운로드 받아
    직접 확인하기 바란다.

     
    #!/usr/bin/expect --
    #
    # Foundry BigIron, ServerIron S/W 'show' command scripts
    #
    # Usage : ./show_foundry.exp <Password> <Enable Password> [Switch IP]
    #
    # 2006.1.24
    # Made by 좋은진호(truefeel, http://coffeenix.net/ )

    set timeout     1

    set login       [lindex $argv 0]
    set enpass      [lindex $argv 1]
    set ip          [lindex $argv 2]

    set sleeptime   0.5
    set prompt      "스위치의 프롬프트를 적으세요."
    set ipdefault   "스위치IP를 적으세요."

    # login  password와 enable password 틀릴 때 Switch의 메시지
    set login_errmsg "failure"
    set en_errmsg   "incorrect password"

    # ------------------------------------------
    # option 확인

    if { $enpass == "" } {
            send "Usage : ./show_foundry.exp <Password> <Enable Password> \[Switch IP\] \n\n"
            exit
    }

    #
    if { $ip == "" } {
            set ip  $ipdefault
    }

    # ------------------------------------------
    # login
    #

    spawn telnet $ip

    expect "Password:"
    sleep $sleeptime
    send "$login\r"

    expect {
        $prompt {
            sleep $sleeptime
            send "en\r"
       } $login_errmsg {
            sleep $sleeptime
            send_user "\n\n\[Error\] invalid password \n"
            exit
       }
    }

    # enable password
    expect "Password:"
    sleep $sleeptime
    send "$enpass\r"

    expect $en_errmsg {
            sleep $sleeptime
            send_user "\n\n\[Error\] invalid enable_password \n"
            exit
    }

    # ------------------------------------------
    # command

    set count       1

    set cmd(1)      "show clock"
    set cmd(2)      "show ip"
    set cmd(3)      "show cha"
    set cmd(4)      "show memory"
    set cmd(5)      "show version"
    set cmd(6)      "show who"
    set cmd(7)      "show stat"
    set cmd(8)      "show log"
    set cmd(9)      "show arp"
    set cmd(10)     "show int brief"
    set cmd(11)     "show server"
    set cmd_cnt     [array size cmd]

    #
    while { $count <= $cmd_cnt } {
            expect $prompt
            sleep $sleeptime
            send "$cmd($count)\r"

            set pause 1
            while { $pause == 1 } {
                    expect "Control-c" {
                            sleep 0.2
                            send "   "
                    } timeout {
                            set pause 0
                    }
            }

            incr count
    }

    # ------------------------------------------
    # logout

    expect $prompt
    sleep  $sleeptime
    send   "exit\r"

    expect $prompt
    sleep  $sleeptime
    send   "exit\r"

    interact
     


    사용방법은 다음과 같다.

     
    # ./show_foundry.exp <접속용 Password> <Enable Password> [Switch IP]
     


    3번째 IP는 입력하지 않으면 스크립트의 $ipdefault 변수에 정의된 IP로 접속을 한다.

    스크립트는 간단하므로, 주요부분인 commmand 처리에 대해서만 설명을 하겠다.
    각명령을 cmd() 배열에 저장을 하고, 배열개수를 cmd_cnt 변수에 저장해둔다.
    while 문으로 cmd_cnt 개수만큼 하나씩 명령을 실행시킨다.
    이 때 중요한 것은 결과가 많으면 pause상태가 되고 임의의 키를 누르면 다음 결과를 보여주는데,
    이를 처리하는게 다음 부분이다.

     
    93  :         set pause 1
    94  :         while { $pause == 1 } {
    95  :                 expect "Control-c" {
    96  :                         sleep 0.2
    97  :                         send "   "
    98  :                 } timeout {
    99  :                         set pause 0
    100 :                 }
    101 :         }
     


    92번째줄 이전에서 지정한 명령이 실행이 되고,
    93번째줄에서 일시정지 메시지("Control-c")를 기다리도록 1로 셋팅을 했다.
    94번째줄 부터는 값이 1인 동안에는 expect 명령으로 일시정지 메시지가 나오는지 기다리게 된다.
    만약 나오면 0.2초 후에 space를 2개 보낸다(space키를 2번 눌렀다고 이해하면 됨).
    그러나 만약 "Control-c" 가 스크립트의 맨 처음에 설정한 1초동안(set timeout 1) 나오지 않는다면
    timeout {} 안의 set pause 0 이 설정되어 while {} 문을 빠져 나오게 된다.
    이렇게 처리하므로 일시정지 메시지가 1번 나올 때나, 여러번 나오올 때나 안나올 때나 능동적으로
    반응을 하게 된다.

    이 스크립트를 ./show_foundry.exp .... > 파일명 처럼 활용해서 결과를 파일로 저장할 수도 있으며,
    cron에 등록하여 주기적으로 결과를 받아서 변화 추이를 파악해볼 수도 있다.

    2. 참고 자료

       * expect 프로그래밍 예 두번째 (글 좋은진호)
       http://coffeenix.net/board_view.php?bd_code=115

       * expect 프로그래밍 예 (글 좋은진호)
       http://coffeenix.net/board_view.php?bd_code=112
      커피닉스 카페 최근 글
    [10/20] Cross Compiler 깔
    [07/14] SSL АО
    [04/26] Re: 도스화면 원격조종 여부
    [04/25] 도스화면 원격조종 여부
    [10/30] Cshell에서 난수 설정
    [10/23] 공항철도주식회사 SE 구인 件
    [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 개발자를 모십니다.
      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일~