반응형

출처: http://egloos.zum.com/mcchae/v/11088170


지난번 TCL+Expect를 통하여 윈도우에서 CLI 자동화에 대하여 약간 살펴보았는데,
윈도우용 python expect 모듈인 pexpect가 제대로 동작하지 않는 것으로 알고 있었습니다만,
구글의 도움과 몇가지 시행착오를 통하여 드디어 성공하였습니다.
(그동안 한 두번 시도를 했다가 실패한 적도 있네요)

물론 리눅스와는 Child Process 관련 작업 및 Terminal IO 등의 문제 때문에 완벽한
호환은 아니더라도, 어느 정도(대부분의 필요한 정도는 가능합니다) 
작업이 가능한 것은 확인하였습니다.

다음은 그 방법입니다.

우선 윈도우용 파이썬이 필요합니다.
다음 다운로드 사이트 에서,

python 2.7.6 Windows Installer 를 다운받습니다.
(64bit용 윈도우 7 OS에서도 잘 동작했습니다)



위와 같은 winpexpect 사이트에 들어가셔서,


상단 오른편의 Download를 누르고, Tags를 눌러 위와 같은 것의 winpexpect-1.5 zip을 다운받았습니다.

그 다음은, pywin32 사이트 에서,


위에서 Browse All Files를 눌러, 최신 Build (이 글을 작성하는 당시 Build 218이 최신 이었음)에서


64bit 윈도우에서도 python2.7 win32 버전을 설치했으므로, 상단에서도 pywin32-218.win32-py2.7.exe 를 다운받았습니다.

그 다음, winpexpect를 설치하기 위해서는 윈도우용 setuptools가 필요한데,

pypi/setuptools#windows 에 들어가셔서,


우측 상단에 ez_setup.py 를 다운받습니다.

이제 다음과 같이 설치가 가능합니다.



1) python-2.7.6.msi 로 파이썬 인터프리터를 설치합니다.

2) pywin32-218.win32-py2.7.exe 로 pywin32 모듈을 설치합니다.

3) 명령창에서 ez_setup.py 를 설치합니다.


4) winpexpect 설치
명령창에서 setup.py install 을 실행합니다.


이제 winpexpect를 이용하여 다음과 같은 파이썬 프로그램이 가능합니다.


import sys
from winpexpect import winspawn as spawn

with open('foo.out','w') as ofp:

 child = spawn('cmd.exe', logfile=ofp)
 child.expect ('>')
 child.sendline ('plink 
toor@192.168.189.128')


 child.expect ('password:.*')
 child.sendline ('r')

 child.expect ('~\$ ')
 child.sendline ('cp /etc/hosts /tmp/hosts')

 child.expect ('~\$ ')
 child.sendline ('cat /tmp/hosts')

 child.expect ('~\$ ')
 child.sendline ('')

 child.expect ('~\$ ')
 child.sendline ('exit')

 child.expect ('>')
 child.sendline ('exit')



참고할 만한 사항입니다.

- spawn은 winspawn 인데 as로 aliasing 시켜서 사용하였습니다.
- spawn시에 logfile에 write file stream을 줌으로써 모든 상황이 해당 파일로 기록되게 할 수 있습니다.
- 바로 command out으로 출력을 할 경우 결과가 제대로 capture 되지 않아 그 위에 있는 cmd.exe를 
  우선 실행시키고 나서 필요 명령을 실행시켰습니다.
  (Linux의 shell 을 실행하고 나서 하위 명령을 수행한 형태)


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

반응형

+ Recent posts