Expect 程序主要用于人机对话的模拟,就是那种系统提问,人来回答 yes/no ,或者账号登录输入用户名和密码等等的情况。因为这种情况特别多而且繁琐,所以很多语言都有各种自己的实现。
最初的第一个 Expect 是由 TCL 语言实现的,所以后来的 Expect 都大致参考了最初的用法和流程。
pexpect 是 Python 语言的类 Expect 实现。pxssh模块用于在python中ssh远程连接,执行命令,返回结果,但注意不支持Windows系统。
例一
1 #!/usr/bin/env python 2 3 #-*- coding:utf-8 -*- 4 5 from pexpect import pxssh 6 7 host = "172.16.1.15" 8 username = "root" 9 password = "123456" 10 cmd1 = "ifconfig" 11 cmd2 = "uptime" 12 13 try: 14 s = pxssh.pxssh() #实例化一个对象 15 s.login(host,username,password) #登录 16 17 s.sendline(cmd1) #执行命令 18 s.prompt() #匹配cmd1执行后的下一步操作的命令提示符 19 print s.before #输出命令提示符之前的内容 20 21 s.sendline(cmd2) 22 s.prompt() #s.prompt()按顺序匹配命令提示符,即如果注释上一个s.prompt(),这次会匹配cmd1执行后的命令提示符,s.before也只会输出cmd1返回的结果 23 print s.before #s.before指的是两个命令提示符之间的内容,即如果注释上一个print s.before,这次也只会输出cmd2返回的结果,而不是cmd1+cmd2的内容 24 25 s.logout() #登出 26 27 except : 28 print "pxssh failed on login."
例二
#!/usr/bin/python #coding:utf-8 from pexpect.pxssh import pxssh class SSH: def __init__(self): pass def connect(self, ip, user='root', password='zx123456'): self.ssh = pxssh() try: self.ssh.login(ip, user, password) return True except Exception as e: import sys print(sys.exc_info()) return False def execute(self,command): CR = '\r\n' self.ssh.sendline(command) # 执行命令 self.ssh.prompt() # 匹配command执行后的下一步操作的命令提示符 # self.ssh.before 指的是两个命令提示符之间的内容 data = (self.ssh.before).split(CR.encode('utf-8'))[1:-1] for each in data: print(each.decode('utf-8'))
>>> from ssh import SSH >>> H1 = SSH() >>> H1.connect('192.168.11.171') # ssh连接到11.171 True >>> H1.execute('pwd') # 在11.171上执行pwd命令 /root