zoukankan      html  css  js  c++  java
  • python pexpect总结

    基本使用流程

    pexpect 的使用说来说去,就是围绕3个关键命令做操作:

    1. 首先用 spawn 来执行一个程序
    2. 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的
    3. 最后当发现这个关键字以后,根据关键字用 send 方法来发送字符串给这个程序
    login()  #建立ssh连接
    logout()  #断开ssh连接
    prompt()  #等待系统提示符,用于等待命令执行结束

    下面是其定义:

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块,它可以用来和像 ssh、ftp、passwd、telnet 等命令行程序进行自动交互。

    从书中我摘取了相关实例并配有注释,用来记录pexpect常用方法:

    下面这个实例功能是:以ssh远程登录,登录成功后执行命令‘ls -lh’

    import pexpect
    import sys

    #通过spawn类启动和控制子应用程序
    child = pexpect.spawn('ssh root@192.168.1.22')

    #将pexpect的输入输出信息写到mylog.txt文件中
    fout = file('mylog.txt','w')
    child.logfile = fout

    #将pexpect的输入输出信息输出到标准输出
    #child.logfile = sys.stdout

    #expect方法用来判断子程序产生的输出,判断是否匹配相应字符串
    child.expect('password:')
    #字符串匹配则使用sendline进行回应-----send:发送命令,不回车、sendline:发送命令,回车、sendcontrol:发送控制符,如:sendctrol('c')等价于‘ctrl+c'、sendeof:发送eof
    child.sendline('123456')
    child.expect('#')
    child.sendline('ls -lh')
    child.expect('#')

    pexpect之spawn类

    复制代码
     1 import pexpect
     2 import sys
     3 
     4 #通过spawn类启动和控制子应用程序
     5 child = pexpect.spawn('ssh root@192.168.1.22')
     6 
     7 #将pexpect的输入输出信息写到mylog.txt文件中
     8 fout = file('mylog.txt','w')
     9 child.logfile = fout
    10 
    11 #将pexpect的输入输出信息输出到标准输出
    12 #child.logfile = sys.stdout
    13 
    14 #expect方法用来判断子程序产生的输出,判断是否匹配相应字符串
    15 child.expect('password:')
    16 #字符串匹配则使用sendline进行回应-----send:发送命令,不回车、sendline:发送命令,回车、sendcontrol:发送控制符,如:sendctrol('c')等价于‘ctrl+c'、sendeof:发送eof
    17 child.sendline('123456')
    18 child.expect('#')
    19 child.sendline('ls -lh')
    20 child.expect('#')
    复制代码

    当然,ssh登录还可以使用pexpect的run函数实现:

    #events是一个字典,定义了expect和sendline的对应关系
    pexpect.run('ssh root@192.168.1.22',events={'password:','123456'})

    针对ssh远程登录,pexpect又派生出了pxssh类,在ssh会话操作上再做一层封装

    其常用方法是:

    login()  #建立ssh连接
    logout()  #断开ssh连接
    prompt()  #等待系统提示符,用于等待命令执行结束

    下面是使用pxssh类来进行远程连接并进行操作的实例:

    from pexpect import pxssh
    import getpass

    try:
    s = pxssh.pxssh() #创建pxssh对象

    hostname = raw_input('hostname:')
    username = raw_input('username:')
    password = getpass.getpass('password:') #接收密码输入

    s.login(server=hostname,username=username,password=password) #建立ssh连接

    s.sendline('uptime') #运行uptime命令
    s.prompt() #匹配系统提示符
    print s.before #打印出现系统提示符前的命令输出

    s.sendline('ls -lh') #运行命令
    s.prompt() #匹配系统提示符
    print s.before #打印出现系统提示符前的命令输出

    s.sendline('df -h') #运行命令
    s.prompt() #匹配系统提示符
    print s.before #打印出现系统提示符前的命令输出

    s.logout() #断开ssh连接

    except pxssh.ExceptionPxssh as e:
    print 'pxssh failed on login'
    print str(e)

    pxssh类

    复制代码
     1 from pexpect import pxssh
     2 import getpass
     3 
     4 try:
     5     s = pxssh.pxssh()   #创建pxssh对象
     6 
     7     hostname = raw_input('hostname:')
     8     username = raw_input('username:')
     9     password = getpass.getpass('password:')   #接收密码输入
    10 
    11     s.login(server=hostname,username=username,password=password)  #建立ssh连接
    12 
    13     s.sendline('uptime')  #运行uptime命令
    14     s.prompt()   #匹配系统提示符
    15     print s.before  #打印出现系统提示符前的命令输出
    16 
    17     s.sendline('ls -lh')  #运行命令
    18     s.prompt()   #匹配系统提示符
    19     print s.before  #打印出现系统提示符前的命令输出
    20 
    21     s.sendline('df -h')  #运行命令
    22     s.prompt()   #匹配系统提示符
    23     print s.before  #打印出现系统提示符前的命令输出
    24 
    25     s.logout()  #断开ssh连接
    26 
    27 except pxssh.ExceptionPxssh as e:
    28     print 'pxssh failed on login'
    29     print str(e)
    复制代码

    转载自

    https://www.cnblogs.com/MacoLee/p/5629837.html

    https://www.cnblogs.com/lisenlin/p/9058557.html

    https://blog.csdn.net/zhongbeida_xue/article/details/78679601

  • 相关阅读:
    设置navigationbar透明度时的坑
    NSOprationQueue 与 GCD 的区别与选用
    CALayer及其子类
    ARC基本原理
    drawRect:和layoutSubview的区别
    NSDictionary 和NSArray 排序(sort)
    iOS常用动画
    项目托管到Github上
    解析歌词
    计算字符串的长度值
  • 原文地址:https://www.cnblogs.com/junsec/p/10511821.html
Copyright © 2011-2022 走看看