Python&での奇妙な振る舞いparamiko 1.7.7.1
。
事実上まったく同じコードを持つ関数とクラスがありますが、クラスはそれを2つのメソッドに分割します。paramiko
ライブラリの動作は異なります。
関数:ssh接続を開き、コマンドを実行し、完了を待ち、終了値を取得します。
クラス:insetup()
はssh接続を開き、コマンドを実行し、finish()
完了を待って終了値を取得します。
stdoutから読み取るsetup()
と、機能する(コメントアウトされている)ことに注意してください。
私は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()