0

pexpect ssh を使用してコンパイル用のスクリプトを書き留めています。ssh の自動化は次のようになります。

enter code here
child = ssh_expect('root', server2, cmd)
child.expect(pexpect.EOF)
print child.before

ここで、cmd は次のとおりです。

cmd = "./configure CFLAGS=\"-g -O0 -DDEBUG\""

問題が発生するのは、

configure: error: unrecognized option: -O0

一方、commands.getoutput を使用して同じコマンドを実行すると、正しく実行されます。

この種のエラーが生成される問題は何ですか?また、どうすればこれを根絶できますか?

前もって感謝します :)

4

1 に答える 1

0

実行している場合に機能する理由commands.getoutputは、そこにあるすべてのコマンドがシェルを介して実行されるためです。シェルはコマンドラインを解析し、CFLAGS の後の二重引用符の間が同じパラメーターの一部であることを理解します。

pexpect を介して cmds を実行している場合、シェルは関与しません。また、ssh コマンドラインでコマンドを提供する場合、ssh 接続の反対側にはシェルが関与しないため、CFLAGS を 1 つのパラメーターに解析するものは何もありません。したがって、configure スクリプトは 1 つのパラメーター (CFLAGS=\"-g -O0 -DDEBUG\") を取得する代わりに、3 つのパラメーター ('CFLAGS=-g'、'-O0'、'-DDEBUG') を取得します。

可能であれば、パラメーターがスペースで区切られているコマンドを送信しないでください。pexpect は代わりに引数のリストを取ることができるようです。作業コード例:

#/usr/bin/env python

import pexpect

def ssh_expect(user, hostname, cmd):
    child = pexpect.spawn("ssh", ["%s@%s" % (user, hostname)] + cmd, timeout=3600)

    return child

child = ssh_expect("root", "server.example.com", ["./configure", "CFLAGS=\"-g -O0 -DDEBUG\""])
child.expect(pexpect.EOF)
print child.before
于 2011-07-24T10:37:46.970 に答える