Python 之 pexpect模块
python安装setuptools模块之后,便可使用easy_install来安装Python的第三方扩展模块,默认安装路径是:
/usr/lib/python2.6/site-packages/
easy_install 模块名 #可以直接安装
easy_install pexpect
[root@zhu ~]# easy_install pexpect
Searching for pexpect
Reading Http://pypi.python.org/simple/pexpect/
Reading http://pexpect.readthedocs.org/
Reading http://pexpect.sourceforge.net/
Reading http://sourceforge.net/project/showfiles.PHP?group_id=59762
Best match: pexpect 3.1
Downloading https://pypi.python.org/packages/source/p/pexpect/pexpect-3.1.tar.gz#md5=5a8e1573062e2e2c203c9a6d213b16e7
Processing pexpect-3.1.tar.gz
Running pexpect-3.1/setup.py -q bdist_egg --dist-dir /tmp/easy_install-KOPmVQ/pexpect-3.1/egg-dist-tmp-GnQBTg
zip_safe flag not set; analyzing arcHive contents...
Adding pexpect 3.1 to easy-install.pth file
Installed /usr/lib/python2.6/site-packages/pexpect-3.1-py2.6.egg
Processing dependencies for pexpect
Finished processing dependencies for pexpect
#由于pexpect-3.1-py2.6.egg此时仍是一个压缩文件,所以需要进行解压。
cd /usr/lib/python2.6/site-packages/
unzip pexpect-3.1-py2.6.egg
pexpect是一个用来启动子程序并对其进行自动控制的python模块,可以用来和ssh,ftp,telnet等需要输入密码的命令行程序进行自动交互。
安装过程如上。
另一种安装方法如下:
wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
tar xzf pexpect-2.3.tar.gz
cd pexpect-2.3
python ./setup.py install
pexpect 模块的使用如下:
>>> pexpect.
pexpect.EOF( pexpect.__path__ pexpect.run(
pexpect.ExceptionPexpect( pexpect.__reduce__( pexpect.runu(
pexpect.PY3 pexpect.__reduce_ex__( pexpect.searcher_re(
pexpect.TIMEOUT( pexpect.__repr__( pexpect.searcher_string(
pexpect.__all__ pexpect.__revision__ pexpect.select
pexpect.__class__( pexpect.__setattr__( pexpect.signal
pexpect.__delattr__( pexpect.__sizeof__( pexpect.spawn(
pexpect.__dict__ pexpect.__str__( pexpect.spawnu(
pexpect.__doc__ pexpect.__subclasshook__( pexpect.split_command_line(
pexpect.__file__ pexpect.__version__ pexpect.struct
pexpect.__fORMat__( pexpect._run( pexpect.sys
pexpect.__getattribute__( pexpect.codecs pexpect.termiOS
pexpect.__hash__( pexpect.errno pexpect.time
pexpect.__init__( pexpect.fcntl pexpect.traceback
pexpect.__loader__ pexpect.os pexpect.tty
pexpect.__name__ pexpect.pty pexpect.types
pexpect.__new__( pexpect.re pexpect.which(
pexpect.__package__ pexpect.resource
1.pexpect.run()函数的使用
run(command, timeout=-1, withexitstatus=False, events=None, extra_args=None, logfile=None, cwd=None, env=None)
#默认情况下该指令:
#1.运行给出的指令command,如果指令不是以绝对路径给出,会自动在PATH中寻找。结果输出作为字符串返回,行与行之间以\r\n分割。
#2.withexitstatus设置为True时,结果返回一个元组,(command_output,
exitstatus)
#events是一个字典,有模式和应答组成,可以自动输入内容,如果应答需要输入enter键时,此时需要为一个新行,即添加\n.
>>> pexpect.run('cat /root/a.txt')
'qian shan\r\nniao fei jue\r\ndu diao han jiang xue\r\n'
>>> pexpect.run('cat /root/a.txt',withexitstatus=1)
('qian shan\r\nniao fei jue\r\ndu diao han jiang xue\r\n', 0)
>>> pexpect.run('scp /root/a.txt 192.168.56.102:/root',withexitstatus=1,events={'passWord': '123456\n'})
("root@192.168.56.102's password: \r\n\ra.txt 0% 0 0.0KB/s --:-- ETA\ra.txt 100% 45 0.0KB/s 00:00 \r\n", 0)
2.pexpect.spawn()类的使用
spawn是Pexpect模块主要的类,用以实现启动子程序,它有丰富的方法与子程序交互从而实现用户对子程序的控制。它主要使用 pty.fork() 生成子进程,并调用 exec() 系列函数执行 command 参数的内容。
child = pexpect.spawn ('/usr/bin/ftp') #执行ftp客户端命令
child = pexpect.spawn ('/usr/bin/ssh user@example.com') #使用ssh登录目标机器
child = pexpect.spawn ('ls -latr /tmp') #显示 /tmp目录内容
child = pexpect.spawn ('/usr/bin/ftp', [])
child = pexpect.spawn ('/usr/bin/ssh', ['user@example.com'])
child = pexpect.spawn ('ls', ['-latr', '/tmp'])
child = pexpect.spawn('some_command')
fout = file('mylog.txt','w')
child.logfile = fout
child = pexpect.spawn('ssh root@192.168.56.102')
child.expect(self, pattern, timeout=-1, searchwindowsize=-1)
为了控制子程序,等待子程序产生特定输出,做出特定的响应,可以使用 expect 方法
在参数中: pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表。需要注意的是,当 pattern 的类型是一个列表时,且子程序输出结果中不止一个被匹配成功,则匹配返回的结果是缓冲区中最先出现的那个元素,或者是列表中最左边的元素。使用 timeout 可以指定等待结果的超时时间 ,该时间以秒为单位。当超过预订时间时, expect 匹配到pexpect.TIMEOUT。
3.打印before的内容
>>> child = pexpect.spawn('ls -l')
>>> child.expect(pexpect.EOF)
0
>>> print child.before
总用量 64
drwxr-xr-x. 3 root root 4096 4月 2 10:09 aaa
-rw-r--r--. 1 root root 45 4月 3 15:01 a.txt
drwxr-xr-x. 16 root root 4096 3月 6 21:36 biaozhunku
drwxr-xr-x. 2 root root 4096 3月 27 17:03 mypython
drwxr-xr-x. 2 root root 4096 4月 3 13:21 mysource
drwxr-xr-x. 2 root root 4096 4月 3 13:20 mywork
drwxr-xr-x. 2 root root 36864 3月 19 11:09 pythoncook
-rw-r--r--. 1 root root 276 4月 3 14:26 zhu.py
#child.before 保存的就是在根目录下执行 ls 命令的结果
send(self, s)
sendline(self, s='')
sendcontrol(self, char)
这些方法用来向子程序发送命令,模拟输入命令的行为。与 send() 不同的是 sendline() 会额外输入一个回车符 ,更加适合用来模拟对子程序进行输入命令的操作。当需要模拟发送 “Ctrl+c” 的行为时,还可以使用 sendcontrol() 发送控制字符。
相关文章