Python模块之pxssh(expect应用)


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."

例二

 1 #!/usr/bin/python
 2 #coding:utf-8
 3 
 4 from pexpect.pxssh import pxssh
 5 
 6 
 7 class SSH:
 8     def __init__(self):
 9         pass
10         
11     def connect(self, ip, user='root', password='zx123456'):
12         self.ssh = pxssh()
13         try:
14             self.ssh.login(ip, user, password)
15             return True
16         except Exception as e:
17             print(sys.exc_info())
18             return False
19     def execute(self,command):
20         CR = '\r\n'
21         self.ssh.sendline(command)
22         self.ssh.prompt()
23         
24         data = (self.ssh.before).split(CR.encode('utf-8'))[1:-1]
25         for each in data:
26             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