python pexpect模块详解附常用脚本

1.下载 安装

wget https://pypi.python.org/packages/source/p/pexpect/pexpect-2.4.tar.gz#md5=fe82d69be19ec96d3a6650af947d5665
tar zxvf pexpect-2.4.tar.gz
cd pexpect-2.4/
python setup.py install



spawn是Pexpect模块主要的类,用以实现启动子程序,它有丰富的方法与子程序交互从而实现用户对子程序的控制。

示例

child = pexpect.spawn ('/usr/bin/ftp') #执行ftp客户端命令
child = pexpect.spawn ('/usr/bin/ssh user@example.com') #使用ssh登录目标机器
child = pexpect.spawn ('ls -latr /tmp') #显示 /tmp目录内容 

expect() 定义

expect(self, pattern, timeout=-1, searchwindowsize=None) 

在参数中: pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表。需要注意的是,当 pattern 的类型是一个列表时,且子程序输出结果中不止一个被匹配成功,则匹配返回的结果是缓冲区中最先出现的那个元素,或者是列表中最左边的元素。使用 timeout 可以指定等待结果的超时时间 ,该时间以秒为单位。当超过预订时间时, expect 匹配到pexpect.TIMEOUT。
如果难以估算程序运行的时间,可以使用循环使其多次等待直至等待运行结束:

expect() 在执行中可能会抛出两种类型的异常分别是 EOF and TIMEOUF,其中 EOF 通常代表子程序的退出, TIMEOUT 代表在等待目标正则表达式中出现了超时。

实例

child.expect(["suc","fail",pexpect.TIMEOUT,pexpect.EOF])
如果查找suc成功返回0 如果超时返回2 如果子程序推出返回3


send 系列函数

send(self, s) 
sendline(self, s='') 
sendcontrol(self, char) 

这些方法用来向子程序发送命令,模拟输入命令的行为。 与 send() 不同的是 sendline() 会额外输入一个回车符 ,更加适合用来模拟对子程序进行输入命令的操作。 当需要模拟发送 “Ctrl+c” 的行为时,还可以使用 sendcontrol() 发送控制字符。


close

如果程序运行中间出现了错误,如用户名密码错误,超时或者 EOF,远程 server 连接不上,都会使用 c hild.close(force=True) 关掉 ftp 子程序。调用 close 可以用来关闭与子程序的 connection 连接,如果你不仅想关闭与子程序的连接,还想确保子程序是真的被 terminate 终止了,设置参数 force=True,其最终会调用 c hild.kill(signal.SIGKILL) 来杀掉子程序。



附录

scp命令使用脚本

# -*- coding: utf-8 -*-
import sys
from optparse import OptionParser
import traceback
import pexpect
import datetime

def scp_from(user,host,route_from,route_to,password):
    cmd = "scp -r %s@%s:%s %s"%(user,host,route_from,route_to)
    print cmd
    scp = pexpect.spawn(cmd)
    try:
        i = scp.expect(['password:',pexpect.EOF],timeout=60)
        if i == 0:
            scp.sendline(password)
            j = scp.expect(['password:',pexpect.EOF],timeout=60)
            if j == 0:
                print "password wrong for %s"%host
    except:
        traceback.print_exc()
    scp.close()

def scp_to(route_from,user,host,route_to,password):
    cmd = "scp -r %s %s@%s:%s"%(route_from,user,host,route_to)
    print cmd
    scp = pexpect.spawn(cmd)
    try:
        i = scp.expect(['password:',pexpect.EOF],timeout=60)
        if i == 0:
            scp.sendline(password)
            j = scp.expect(['password:',pexpect.EOF],timeout=60)
            if j == 0:
                print "password wrong for %s"%host
    except:
        traceback.print_exc()
    scp.close()



def main():
    usage1 = "python scp.py from user host route_from route_to passwprd"
    usage2 = "=(scp -r user@host:/route_from route_to)"
    usage3 = "python scp.py to route_from user host route_ro passwprd"
    usage4 = "=(scp -r route_from user@host:/route_ro)"
    parser = OptionParser(usage=usage1+usage2+usage3+usage4)
    (options,args) = parser.parse_args()
    if len(args) < 6 or len(args) > 6 or (args[0] != 'from' and args[0] != 'to'):
        print usage1
        print usage2
        print usage3
        print usage4
        return

    print options
    print args

    if args[0] == 'from':
        user = args[1]
        host = args[2]
        route_from = args[3]
        route_to = args[4]
        password = args[5]
    else:
        user = args[2]
        host = args[3]
        route_from = args[1]
        route_to = args[4]
        password = args[5]

    if 'from' in args:
        scp_from(user,host,route_from,route_to,password)

    elif 'to' in args:
        scp_to(route_from,user,host,route_to,password)

    now = datetime.datetime.now()
    now_time = datetime.datetime.strftime(now,'%Y年%m月%d日  %H:%M:%S ')
    print now_time


if __name__ == "__main__":
    main()








  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pexpectPython语言中的一个第三方模块,用于控制和自动化操作控制台或终端程序。它可以实现自动输入命令、自动应答、自动化交互式控制等功能,适用于自动化测试、批量操作等场景。 pexpect模块常用类和方法包括: - spawn类:用于启动一个子进程并连接到其标准输入、输出和错误输出,可以在子进程中执行命令。 - expect方法:等待子进程输出特定的字符串或正则表达式,并返回匹配的字符串。 - send方法:向子进程发送字符串或命令。 - interact方法:进入交互模式,允许用户手动输入和输出。 - timeout属性:设置expect方法等待子进程输出的超时时间。 下面是一个示例代码,演示了如何使用pexpect模块连接到telnet服务器,并执行登录和命令操作: ``` import pexpect host = '127.0.0.1' port = 23 user = 'user' password = 'password' command = 'ls' # 启动telnet进程 child = pexpect.spawn('telnet %s %d' % (host, port)) # 等待登录提示 child.expect('login:') # 发送用户名 child.sendline(user) # 等待密码提示 child.expect('Password:') # 发送密码 child.sendline(password) # 等待登录成功提示 child.expect('$') # 发送命令 child.sendline(command) # 等待命令输出 child.expect('$') # 输出命令结果 print(child.before.decode()) # 退出交互模式 child.interact() ``` 这段代码中,使用spawn类启动一个telnet子进程,并通过expect和send方法实现自动登录和执行命令。最后使用interact方法进入交互模式,允许用户手动操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值