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$
ということで、出来ました。
これが出来ると、ほぼ、やりたい事はできるな。