[Windows 7] Expect Develop Tip

Tcl (티클)이라는 스크립트 언어는 Tool Command Language 라는 것에서 의미하듯이
쉬운 커맨드 언어로서 만들어졌습니다.

Tk라는 것을 덧 붙여 GUI 프로그래밍을 하기도 하였으나,
Tcl을 보다 더 잘 사용한 것은 Expect 라는 모듈을 이용하면서부터 입니다.

expect 라는 자체 인터프리터를 가지고 있기도 하지만,
실은 Tcl 인터프리터에 expect 모듈이 포함된 개념이었습니다.

expect는 사용자가 CLI(Command Line Interface)를 이용하여
터미널에서 하는 모든 일을 자동화 할 수 있는 기능을 제공합니다.
쉽게 이야기하여, telnet을 치고 들어가고 사용자, 암호 등을 
입력하면 원격 쉘이 나와서 필요한 명령을 넣고 작업이 끝나면
원격 접속이 끊기는 일련의 작업을 자동화 할 수 있다는 의미이지요.

파이썬에서는 pexpect라는 Pure python 모듈이 있어 expect 기능을 하였습니다.
그런데 윈도우에서는 동일 기능의 모듈이 Terminal I/O 기능의 문제로
제대로 지원이 안된다는데 문제가 있습니다.

따라서 윈도우에서 expect 기능을 이용하려면 직접 tcl 인터프리터를 이용하면
이 문제를 해결할 수 있습니다.

우선 윈도우7에서 웹브라우저를 띄우고 ActiveState 라는 사이트의 ActiveTcl 로 들어갑니다.

위에서 Download Now 를 누르로 다운로드 받아 패키지를 디폴트로 설치합니다.

설치를 마치고 나면,

C:\Tcl\bin 폴더에 위와 같이 tclsh.exe 를 포함한 파일들이 설치되었음을 알 수 있습니다.
(시스템 PATH에는 포함되어 있지 않습니다)

이제 터미널 창을 열고 위 폴더에 가서 다음과 같은 명령을 내립니다.

C:\Tcl\bin> teacup.exe install Expect

이 명령은 현재 시스템의 Tcl 환경에 Expect 모듈을 추가하는 패키지 관리자를 돌립니다.

Expect는 자체로 원격 접속 명령을 포함하고 있지는 않습니다.
대신 telnet, ftp, ssh 등의 원격 접속 프로그램을 실행 (spawn) 시키는 것이지요.

윈도우7에서 이런 원격접속 명령행으로서 Putty를 이용해 보도록 하겠습니다.

putty 가 설치되었고, 실행파일이 시스템의 PATH에 포함된 경우, 위와 같이 터미널 창을 열어
plink.exe 명령을 수행할 수 있습니다. (ssh 클라이언트 프로그램과 동일합니다)

이제 expect를 수행해 보겠습니다.


#!/usr/bin/expect
# \
exec tclsh "$0" ${1+"$@"}
package require Expect

#!/usr/bin/expect

proc usage {} {
    puts "usage: scp.exp {host} {user} {passwd}"
    puts "\t=> for ssh shell connection"
    puts "usage: scp.exp {host} {user} {passwd} {cmd}"
    puts "\t=> for ssh cmd execution"
    exit 1
}

set argc [llength $argv]

if {$argc < 3 || $argc > 4} {
    usage
}

set HOST [lindex $argv 0]
set USERID [lindex $argv 1]
set PASSWD [lindex $argv 2]
if {$argc > 3} {
    set CMD [lindex $argv 3]
}

set prompt "~$ "

puts "$argc $HOST $USERID $PASSWD"

spawn plink $USERID@$HOST

puts "after spawn plink"

if {$argc == 3} {
    expect {
        "(y/n) " { send "y\r"; exp_continue }
        -re "(P|p)assword(: |:)" { send "$PASSWD\r"; exp_continue }
        $prompt
    }
    interact
} else {
    set cmdcnt 0
    expect {
        "(y/n) " { send "y\r"; exp_continue }
        -re "(P|p)assword(: |:)" { send "$PASSWD\r"; exp_continue }
        $prompt {
            if {$cmdcnt == 0} {
                incr cmdcnt;
                send "$CMD\r"; exp_continue
            } else {
                send "exit\r";
            }
        }
    }
}

위의 내용을 c:\Temp\ssh.tcl 라는 파일로 저장하였습니다.

그 다음 위와 같이 명령창을 띄우고 C:\Temp 폴더에서

c:\tcl\bin\tclsh.exe ssh.tcl 192.168.189.128 toor r ls

라고 명령을 내리면, 결과를 잘 수행합니다.

두 가지 정도 리눅스 Expect 와 다른 점이 있는데,

그 하나는 스크립트 첫 시작 부분에서,


#!/usr/bin/expect
# \
exec tclsh "$0" ${1+"$@"}
package require Expect

위와 같이 2~4 줄에 있는 것과 같이 추가해 줍니다.

또한 두번째 틀린 점은 interact 스크립트 명령이 듣지 않는 것이 있습니다.

일단은 이 정도만 가지고 훌륭한 시작점으로 활용할 수 있을 수 있습니다.


어느분께는 도움이 되셨기를...

핑백

덧글

댓글 입력 영역

구글애드텍스트