Python Fabric で、自動応答 -- pexpect

結局、Expectになった。

どうやら、Fabricは、プロンプトに対しての自動応答の提供は、やらない方針みたいだ。
まぁ、それが大変だから、こういう仕掛けを作っていると言えば、それもそうだ。


昔は、出来なかったが、今は、ptyへの入力ができるので、expectを使えば
自動応答は、可能だし。


ということで、やってみる。

def python_shell():

    run("python")

こういう、関数を作って、リモートホストに実行する。

MBA:fabric guutara$ fab python_shell
[] Executing task 'python_shell'
[] run: python
[] out: Python 2.7.3 (default, May 16 2012, 14:24:13) 
[] out: [GCC 4.2.1 20070719  [FreeBSD]] on freebsd7
[] out: Type "help", "copyright", "credits" or "license" for more information.
[] out: >>> 

ここで、入力待ちになって止まるので、以下を入力すると、実行が終了する。

[] out: >>> exit()
[] out: 


Done.
Disconnecting from xxxxxxxx@xxxxxxxx.sakura.ne.jp... done.

さて、これを自動応答させてみる。
思いっきりベタですが。。

import pexpect

env.use_ssh_config = True
env.hosts = ['xxxxxxxx']

env.shell = "/usr/local/bin/bash -l -c "

def expect():

    cmd= "fab python_shell"

    child = pexpect.spawn(cmd)
    child.logfile = sys.stdout

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

  
def python_shell():

    run("python")

で、実行してみる。

MBA:fabric guutara$ fab expect
[] Executing task 'expect'
[] Executing task 'python_shell'
[] run: python
[] out: Python 2.7.3 (default, May 16 2012, 14:24:13) 
[] out: [GCC 4.2.1 20070719  [FreeBSD]] on freebsd7
[] out: Type "help", "copyright", "credits" or "license" for more information.
[] out: >>> exit()

Done.
MBA:fabric guutara$

ということで、出来ました。


これが出来ると、ほぼ、やりたい事はできるな。