pythonpexpect模块详解_pythonpexpect原理详解及使⽤说明pexpect是python中⽤于实现SSH,FTP,telnet等命令进⾏⾃动化交互,从⽽⽆需⼈⼯⼲预实现⾃动化运维的⼀个第三⽅扩展模块。理论的描述过于抽象,这⾥⾸先设想⼀下,如果让您设计⼀个实现⾃动化模块的模型您会怎么设计,哦,我们只需要做简单的执⾏或开始操作,详细的过程程序⾃动执⾏,完成后返回对应的执⾏结果给我,那如何实现呢,对⽐⼀下⾃动化和⾮⾃动化的区别就会有思路,举⼀个简单SSH登录192.168.1.10服务器,然后执⾏⼀个ifconfig命令来查看⽹卡状态的⼯作为例,在⾮⾃动化场景下,⾸先需要调⽤SSH客户端执⾏ssh 192.168.1.10登录,接着登录窗⼝提⽰输⼊登录名,输⼊⽤户名后继续提⽰输⼊密码,登录成功后再执⾏ifconfig命令,得到返回。从这个过程可以看出,这个⼯作在完成过程中需要不断的交互,服务器返回消息,客户端根据服务器提⽰输⼊,那实现⾃动化最简单的⽅法就是预先知道服务器会依次有哪些返回,在得到返回后⾃动完成输⼊就可以屏蔽交互式,实现⾃动化操作。pexpect的设计正是遵循这个思路,接下来详细讲解。
苹果手机nfc怎么复制门禁卡⼀. pexpect的安装
作为python的⼀个普通模块,pexpect⽀持pip,easy_install或源码安装⽅式,具体命令及过程如下:
pip install pexpect
easy_install pexpect
tar -zxvf pexpect-3.
cd pexpect-3.0
python setup.py install
完成后执⾏import pexpect和dir(pexpect)命令验证⼀下导⼊成功,如下:
Python 2.7.4 (default, Feb 24 2016, 11:19:23)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pexpect
>>> dir(pexpect)
['EOF', 'ExceptionPexpect', 'Expecter', 'PY3', 'TIMEOUT', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__',
'__path__', '__revision__', '__version__', 'exceptions', 'expect', 'is_executable_file', 'pty_spawn', 'run', 'runu', 'searcher_re',
'searcher_string', 'spawn', 'spawnbase', 'spawnu', 'split_command_line', 'sys', 'utils', 'which']
⼆. pexpect使⽤详解
⾸先以开篇中描述的⾃动登录192.168.1.10服务器执⾏ifconfig命令查看⽹卡状态为例,
#vim test1.py
import pexpect #导⼊pexpect模块
child = pexpect.spawn('ssh user@192.168.1.10') #⽣成⼀个⼦程序,程序执⾏ssh登录操作
fout = file('test1.log','a') #定义⼀个⽇志⽂件
child.logfile = fout #将⼦程序child的过程输出到⽇志⽂件fout(也就是test1.log⽂件)
child.sendline('1qaz!QAZ') #如果匹配,则发送密码给服务器验证,这⾥user的密码是1qaz!QAZ
child.sendline('ifconfig') #如果匹配,则发送ifconfig命令
print child.before #向标准输出打印⼦程序最后⼀次匹配前的内容
命令执⾏结果如下:
[root@localhost python]# python p6.py
ifconfig好看的古代耽美小说
eth0 Link encap:Ethernet HWaddr 00:0C:29:19:42:F2
inet6 addr: fe80::20c:29ff:fe19:42f2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2437 errors:0 dropped:0 overruns:0 frame:0
TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:269529 (263.2 KiB) TX bytes:2310 (2.2 KiB)
eth1 Link encap:Ethernet HWaddr 00:0C:29:19:42:FC
inet addr:192.168.0.92 Bcast:192.168.3.255 Mask:255.255.252.0
inet6 addr: fe80::20c:29ff:fe19:42fc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:120482 errors:0 dropped:0 overruns:0 frame:0
TX packets:61192 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:96175495 (91.7 MiB) TX bytes:7291914 (6.9 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1883 errors:0 dropped:0 overruns:0 frame:0
鸡腿炖土豆的家常做法TX packets:1883 errors:0 dropped:0 overruns:0 carrier:0
特殊教育专业collisions:0 txqueuelen:0
RX bytes:258305 (252.2 KiB) TX bytes:258305 (252.2 KiB)
发现当前⽬录下多出⼀个test1.log⽂件,⽂件内容为:
[root@localhost python]# cat test1.log
user@192.168.1.10's password: 1qaz!QAZ
qq个性签名搞笑Last login: Thu Feb 25 19:35:51 2016 from 192.168.1.5
现在我们以上⽂⽰例多pexpect语法进⾏详细说明
spawn类
spawn作为pexpect的主要类接⼝,作⽤是启动和控制⼦程序,以下是它的构造函数
class pexpect.spawn(command, args=
[],timeout=30,maxread=2000,searchwindowsize=None,logfile=None,cwd=None,env=None,ignore_sighup=Ture)
其中command为系统⽀持的任⼀命令,其他参数可选。
通过定义可以看到,这个类的作⽤就是执⾏⼀个系统命令⽤于开启⾃动化运⾏的第⼀步,所以通常放在第⼀⾏
注:这⾥说的⼦程序可以理解为就是spawn类的⼀个实例
2. 第⼀步执⾏后⾃动化脚本就开始运⾏了,如果想通过⼀个⽇志⽂件记录脚本在执⾏过程中经过了哪些步骤,以便了解细节及后期故障排查,则可以通过child.logfile⽅法指定⼀个⽇志输出⽂件。为了能
够记录的完整,我们通常在启动脚本后随即就定义⽇志输出,也就是此命令放在第⼆⾏的原因。
3. expect⽅法
expect定义了⼀个⼦程序输出的匹配规则。
上例中pect('password') 意思就是在ssh user@192.168.1.10后判断程序是否会返回⼀个包含"password"的字符串,这⾥需要说明两点。1,引号中的字符串可以不是完整的程序返回,只要是程序返回的⼦集就可以匹配成功。⽐如程序返回的完整字符串
是'user@192.168.1.10's password:',但是引号中只写'password'也是可以匹配成功的。2,如果预设的返回值如果不匹配,程序不会⾃动向下继续执⾏,⽽是卡在匹配失败的这个界⾯。⽐如在上例pect('password')前再加⼀条pect('nihao'),这时程序执⾏就停⽌了,查看⽇志⽂件可以发现最后⼀⾏为root@127.0.0.1's password:表⽰程序卡在输⼊密码这⾥了。
4. sendline⽅法
sendline作⽤是向⼦程序发送响应命令并按下回车,可以理解成替代了我们在标准键盘上的输⼊。上例中的意思就是在收到⼦程序返回字符串'password'后发送密码。
5. before和after⽅法
before保存了最近⼀次匹配成功前⼦程序的返回内容,after保存了最近⼀次匹配成功后⼦程序返回的内容。上例中最后⼀次匹配字符串金钟仁jennie分手
是'#',在匹配成功前程序的返回是执⾏ifconfig命令的结果,所以print child.before会输出ifconfig命令结果到显⽰器。
上⽂描述了使⽤pexpect执⾏⾃动化操作的⼤致步骤,按此⽅法详细顺序定义好程序的返回和要输⼊内容即可完成⼤量操作的⾃动化执⾏,定义之前可以⼿⼯先执⾏⼀下命令确认具体的交互过程。
发布评论