Python pexpect模块的使用及示例代码

简介:

Pexpect 是 Expect 语言的一个 Python 实现,用于生成子应用程序并自动控制它们,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块。本文主要介绍Python pexpect模块的使用及示例代码。

1、Expect工具语言
expect是一个简单的工具语言,它的作者对Expect的定义:是一个实现自动交互功能的软件套件(a software suite for automating interactive tools),使用expect,它能帮助我们在合适的情景下进行合适的交互。

expect 的核心功能,对于设定好的特定匹配形式,以相匹配的动作以应对。每一个expect后所跟的字符串(或者正则表达式)就是脚本所等待的匹配模式,每一个send 所做的工作就是对于各种的模式串,实施相应的动作。

2、pexpect模块的安装

pip install pexpect

3、pexpect模块的使用
Pexpect 系统有两个主要接口;这些是函数run() 和类 s​​pawnspawn 类更强大。run()函数比 spawn 简单,适合快速调用程序。当调用 run() 函数时,它会执行给定的程序,然后返回输出。很容易替代 os.system()

1)spawn()

spawn() 方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作。

注意:spawn() 使用时,需要使用特殊符号的正确含义就必须加上 shell 来运行。

例如,

process = pexpect.spawn('/bin/bash –c "ls –l | grep error > log.txt"')

2)expect()

expect()用来关键字匹配,spawn() 启动了一个程序并返回程序控制句柄后,则可以用 expect() 方法来等待指定的关键字。它最后会返回 0 表示匹配到了所需的关键字,如果后面的匹配关键字是一个列表的话,就会返回一个数字表示匹配到列表中第几个关键字,从 0 开始计算。

3)send()

send()方法用来发送关键字,向程序发送指定的字符串。

4)sendline()

sendline()方法用来发送带回车符的字符串,sendline()send()区别只是在发送的字符串后面加上了回车换行符。

5)sendcontrol()

sendcontrol()方法用于发送控制信号,向子程序发送控制字符,如 Ctrl + C 或者 Ctrl + D 等,需要向子程序发送 Ctrl + C,则可以使用process.sendcontrol('c')

4、使用pexpect执行scp命令
使用pexpect执行scp命令,可以代码中指定密码,不用手动输入,可以批量自动处理。

import pexpect

username='root' 
aim_ip='192.168.31.11' 
password='Aa123456'
source_file_path='/home/root/cjavapy'
aim_file_path='/home/'
port=22
password_key = '.*assword.*'
command = f'scp {source_file_path}  {username}@{aim_ip}:{aim_file_path}'

print("开始在本地服务器上执行指令: ", command)
try:
    execute = pexpect.spawn(command)
    execute.expect(password_key)
    execute.sendline(password)
    execute.expect(pexpect.EOF)
    print("拷贝成功")
except:
    print("拷贝失败")

5、使用pexpect实现自动登陆
可以使用pexpect实现通过密码或密钥文件ssh自动登陆Linux服务器,代码如下,

# -*- coding: utf-8 -*-
#!/usr/bin/python

import pexpect

def login_ssh_password(port,user,host,passwd):
    '''实现pexpect实现ssh的自动化用户密码登录'''
    if  port and user and host and passwd:
        ssh = pexpect.spawn('ssh -p %s %s@%s' % (port,user, host))
        i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
        if i == 0 :
            ssh.sendline(passwd)
        elif i == 1:
            ssh.sendline('yes\n')  # 交互认证
            ssh.expect('password: ')
            ssh.sendline(passwd)
        index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])
        if index == 0:
            print("logging in as root!")
            ssh.interact()
        elif index == 1:
            print("logging process exit!")
        elif index == 2:
            print("logging timeout exit")
    else:
        print("Parameter error!")

def login_ssh_key(keyfile,user,host,port):
    '''实现pexpect实现ssh的自动化密钥登录'''

    if  port and user and host and keyfile:
        ssh = pexpect.spawn('ssh -i %s -p %s %s@%s' % (keyfile,port,user, host))
        i = ssh.expect( [pexpect.TIMEOUT,'continue connecting (yes/no)?'], timeout=2)
        if i == 1:
            ssh.sendline('yes\n')
            index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])
        else:
            index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])
        if index == 0:
            print("logging in as root!")
            ssh.interact()
        elif index == 1:
            print("logging process exit!")
        elif index == 2:
            print("logging timeout exit")
    else:
        print("Parameter error!")

def main():
    '''实现两种方式分别的登录'''
    login_ssh_password('22','root','192.163.31.11','Aa123456')
    # login_ssh_key(keyfile="/tmp/id_rsa",port='22',user='root',host='192.168.31.21')


if __name__ == "__main__":
    main()

了解更多分析及数据抓取可查看:
http://data.yisurvey.com:8989/
特别说明:本文旨在技术交流,请勿将涉及的技术用于非法用途,否则一切后果自负。如果您觉得我们侵犯了您的合法权益,请联系我们予以处理。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值