仅为 python 中的所有对象创建一个预期会话

Create one pexpect session only for all objects in python

我正在尝试创建一个 class 以使用 pexpect 连接到 box 并从该框中获取一些数据,但我很难创建一个包含我的 box 的 pexpect 会话并对其进行初始化的函数对于我在下面的 class 代码示例中创建的每个对象。

class A:
   def __init__(self)
       # in this way a session will be created for each object and i don't 
       # need that i need only one session to open for any object created.
       session = pexpect.spawn('ssh myhost')
       session.expect('myname@myhost#')

   def get_some_data(self,command)
       session.sendline(command)
       session.expect('myname@myhost#')
       list = session.before.splitlines()
       return list

现在我的问题是,如果我确实创建了一个新对象,将为每个对象创建一个新会话,而这不是必需的我只能为我由此创建的每个对象使用一个会话 class

您可以为 pexpect 的实例(子)使用 class method to connect and set a class variable。然后这个 class 中的实例方法可以使用那个 class 变量

import pexpect

class Comms:
    Is_connected = False
    Name = None
    ssh = None

    @classmethod
    def connect(cls, name):
        cls.Name = name
        cls.ssh = pexpect.spawn('ssh ' + name)
        cls.ssh.expect('password:')
        cls.ssh.sendline('*****')
        cls.ssh.expect('> ')
        print cls.ssh.before, cls.ssh.after
        cls.Is_connected = True

    @classmethod
    def close(cls):
        cls.ssh.close()
        cls.ssh, cls.Is_connected = None, False

    def check_conn(self):
        print self.Name + ' is ' + str(self.Is_connected)
        return self.Is_connected

    def cmd(self, command):
        self.ssh.sendline(command)
        self.ssh.expect('> ')
        return self.ssh.before + self.ssh.after

在实例方法中使用的self.ssh是一种在class中使用class变量的方法,如果它没有分配给.如果它被分配给那将改为创建一个具有相同名称的实例变量。在这种情况下,这不应该发生,因为没有理由在这个 class 中分配给 ssh

class 方法接收 class 作为隐式参数,因此可以使用 cls.ssh。在实例方法中,还可以获得对 class 的引用,然后使用 cls.ssh

def cmd(self, command):
    cls = self.__class__
    cls.ssh.sendline(command)
    ...

一个class变量可以像Comms.ssh一样在任何地方使用。这是一个相当简单的class.

现在通过不同的实例使用 class 方法和 运行 命令连接到主机

from comms import Comms

userathost = 'xxx@xxxxx'

print 'Connect to ' + userathost
Comms.connect(userathost)

conn_1 = Comms()
conn_1.check_conn()
print conn_1.cmd('whoami')
print

conn_2 = Comms()
print 'With another instance object: pwd:'
print conn_2.cmd('pwd')

Comms.close()

使用真实的 userathost,并在 [description] 中编辑了个人详细信息,这将打印

Connect to xxx@xxxxx

Last login: Sat Aug 12 01:04:52 2017 from *****
[... typical greeting on this host]
[my prompt] > 
xxx@xxxxx is True
whoami
[my username]
[my prompt] > 

With another instance object: pwd:
pwd
[path to my home]
[my prompt] > 

应该更好地建立连接并更好地处理输出,但仅此而已 pexpect


对于 class/static 方法和变量,参见