1

Python&での奇妙な振る舞いparamiko 1.7.7.1

事実上まったく同じコードを持つ関数とクラスがありますが、クラスはそれを2つのメソッドに分割します。paramikoライブラリの動作は異なります。

関数:ssh接続を開き、コマンドを実行し、完了を待ち、終了値を取得します。

クラス:insetup()はssh接続を開き、コマンドを実行し、finish()完了を待って終了値を取得します。

stdoutから読み取るsetup()と、機能する(コメントアウトされている)ことに注意してください。

私は2つのことに興味があります。

  1. チャンネルをメンバーとして保存しながらクラスを機能させる方法、および

  2. 行動を変えている割り当てなどの点で正確に何が違うのですか?

出力:

[function]
exitVal: 0
stdout: hello

[class]
exitVal: -1
stdout: 

コード:

MY_SERVERキーベースのログインを使用するホスト名です(パスワードは不要です)。

from paramiko import SSHClient

SSH_SERVER = "MY_SERVER"
SSH_CMD = "echo 'hello'"

def working_function():

    client = SSHClient()
    client.load_system_host_keys()

    # connect with current user credentials
    client.connect(SSH_SERVER)

    sshChannel = client.get_transport().open_session()

    sshChannel.exec_command(SSH_CMD)
    stdout = sshChannel.makefile('rb')
    exitVal = sshChannel.recv_exit_status()

    print "exitVal: {0}\nstdout: {1}\n".format(exitVal, stdout.read())

class NotWorkingClass:

    def setup(self):

        client = SSHClient()
        client.load_system_host_keys()

        # connect with current user credentials
        client.connect(SSH_SERVER)

        self.sshChannel = client.get_transport().open_session()
        self.sshChannel.exec_command(SSH_CMD)

        self.stdout = self.sshChannel.makefile('rb')

        # works
        # self.stdout.read()

    def finish(self):

        exitVal = self.sshChannel.recv_exit_status()
        print "exitVal: {0}\nstdout: {1}\n".format(exitVal, self.stdout.read())

working_function()

c = NotWorkingClass()
c.setup()
c.finish()
4

0 に答える 0