在python / paramiko中保留对通道的引用

时间:2013-01-24 12:12:40

标签: python paramiko

Python中的奇怪行为& paramiko 1.7.7.1

我有一个函数和一个有完全相同代码的类,但是这个类在两个方法中打破了它。 paramiko库的行为不同。

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

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

我注意到如果我从setup()中的stdout读取它然后工作(注释掉)。

我对两件事感兴趣,

  1. 如何在将频道存储为成员时让课程正常工作,

  2. 在改变行为的作业等方面究竟有什么不同?

  3. 输出:

    [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()
    

0 个答案:

没有答案