2010-11-30 11 views
0

私はSSHでいくつかのタスクを自動化するためにtwisted.conchを学び始めています。複数のコマンド、返信、対話型コマンドにチャネルを使用していますか?

I tried to modifyサンプルsshclient.pyはhttp://www.devshed.com/c/a/Python/SSH-with-Twisted/4/です。ログイン後に1コマンドを実行し、キャプチャされた出力を出力します。

What I wanted to doは、一連のコマンドを実行し、出力に基づいて何をすべきかを決めることができます。

The problem I ran intotwisted.conch.ssh.channel.SSHChannelは常に(例えば -h DFとして)コマンドを実行した後に自分自身を閉じているように見えるということです。この例は、sendRequestの後にchannelOpenの後になります。その後、チャンネルは常にdataReceivedの後に閉じられます。

これは、サーバーがコマンドの後にEOFを送信したことによるものかどうかと思います。したがって、このチャンネルは閉じなければなりませんか?私は複数のコマンドのために複数のチャンネルを開くべきですか?

Another problem isこれらの対話型コマンド(rm -i somefileなど)。サーバーがEOFを送信しなかったため、SSHChannel.dataReceivedが呼び出されないようです。このような状況で出力をキャプチャするにはどうすればよいですか?また、応答を返すにはどうすればよいですか?

+0

「一連のコマンドを実行する」が* expect *コマンドに似ていることを明確にしたいと思います。 –

答えて

2

複数のコマンドで複数のチャネルを開くだけでいいですか?

イエップ。それがSSHの仕組みです。

はSSHChannel.dataReceivedこれはどうするかのような音はありません

と呼ばれることは決してありません。おそらく、動作を再現する最小限の例を含めることができます。

+0

答えをありがとう。この動作を再現するには、http://www.devshed.com/c/a/Python/SSH-with-Twisted/4/のコードを使用し、* rm -i somefile *コマンドを実行するだけです。 dataReceivedは受け取ったものを印刷しなければならない、私は何も見ていない。 –

+1

Ah。これは、 'rm -i somefile'がそのプロンプトをstderrに書き込むためです。これらのバイトは、 'dataReceived'コールバックに渡されるのではなく、' extReceived'コールバックに渡されます。 Twisted logging(twisted.python.log.startLogging)を有効にすると、SSHクライアントは何が起こっているのかに関する多くの追加情報をダンプし、他の同様の問題を追跡するのに役立ちます。 –

+0

はい。これは 'extReceived'コールバックです。ログのヒントをありがとう。 –

関連する問題