1

Python & 中的奇怪行为paramiko 1.7.7.1

我有一个函数和一个类,它们实际上具有完全相同的代码,但该类将其分解为 2 个方法。paramiko图书馆的行为是不同的。

功能:打开 ssh 连接,运行命令,等待完成并获取退出值。

类: insetup()打开 ssh 连接,运行命令并finish()等待完成并获取退出值。

我注意到,如果我从其中的标准输出中读取,setup()则可以正常工作(已注释掉)。

我对两件事感兴趣,

  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