Python 之 pexpect模块

2023-01-31 05:01:32 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() 发送控制字符。





















相关文章