pexpect用来启动子程序,使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的python模块,当然我们可以使用他来做ssh登陆,ssh模块登陆还有一个基于python实现远程连接,用于ssh远程执行命令,文件传输等功能的ssh客户端模块paramiko。

  在开发时也经常会使用pexpect模块,所以这里简单介绍一下pexpect。

  run():直接执行命令返回结果和状态

  run里有一个command参数,可以直接写命令然后拿到命令返回的状态和结果。

In [2]: import pexpect

In [3]: pexpect.run("ls /tmp/")

  我的/tmp下的东西有点多,已经删除了部分,此时只拿到了执行的结果但是没有拿到执行的状态。

In [4]: pexpect.run("ls /tmp", withexitstatus=1)

  withexitstatus为1则表示需要返回执行状态,默认不返回。

  执行状态为:

  返回的结果是一个元组,下标1的值为0即执行成功,非0则为执行失败。

  命令不存在时会报错,

  命令存在但是执行失败则打印错误信息,得到非0状态码。

  spawn

  启动子程序,有丰富的方法实现对子程序的控制。

  比如我们使用spawn进行ssh连接:

In [7]: ssh_aliyun = pexpect.spawn('ssh 120.79.254.225')

In [8]: ssh_aliyun.expect("password:")

  生成一个实例对象,使用在expect期望的结果中我们可以使用完全匹配也可以使用正则匹配。

  当匹配成功以后会返回状态码0,匹配字段不存在,则程序阻塞,知道timeout程序会报错。

  注:expect中的$就是$不是正则表达式里的以某某结尾的意思。

  当然我们不希望匹配不成功而导致程序崩溃,expect中也可以填入错误状态,或者多个期待值,放在一个列表中。

In [18]: ssh_aliyun = pexpect.spawn('ssh 120.79.254.225')

In [19]: ssh_aliyun.expect([pexpect.TIMEOUT, pexpect.EOF, "password:"])
Out[19]: 2

  返回的结果为列表下标索引值。timeout则结果为0.

  对于刚才的实例,我对阿里云服务器发起ssh远程连接,需要进行密码校验,那么我们如何进行命令键入呢。

  我们可以使用send(),sendline(),sendcontrol(char)。向子程序发送指令。前两种就是发送指令,后一种发送控制符(比如发送ctrl+c中断命令)。

  密码登陆的ssh脚本

import pexpect

def login_ssh_passwd(port="",user="",host="",passwd=""):
'''函数:用于实现pexepect实现ssh的自动化用户密码登录''' # print 'ssh -p %s %s@%s' % (port,user, host)
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
# 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=""):
'''函数:用于实现pexepect实现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)
# print '...................................',0
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!")

  使用pexpect实现ssh远程登陆存在一些问题,依赖终端来完成登陆。在不同的登陆环境(系统不一致,端口不一致等)兼容性比较差。

  在资产管理的登陆扫描探测的具体环境中不适合直接使用pexpect来操作。

pexpect模块的更多相关文章

  1. Pexpect模块的安装

    Pexpect模块的安装 下载地址:https://pypi.python.org/pypi/pexpect/ 解压后在目录下运行:python ./setup.py install (必须是root ...

  2. 8.python 系统批量运维管理器之pexpect模块

    小插曲 前几节讲了paramiko模块,但是pexpect模块的功能几乎跟paramiko一样,先来分析一下: 1.各自介绍 pexpect是一个通过启动子程序,使用正则表达式对程序输出做出特定响应, ...

  3. Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  4. Python中的Pexpect模块的简单使用

    Pexpect 是一个用来启动子程序并对其进行自动控制的 Python 模块. Pexpect 可以用来和像 ssh.ftp.passwd.telnet 等命令行程序进行自动交互.以下所有代码都是在K ...

  5. python之pexpect模块

    最近在看<Python自动化运维技术与最佳实战>这本书,学到了一个运维中用到的模块:pexpect 下面是其定义: Pexpect 是一个用来启动子程序并对其进行自动控制的 Python ...

  6. python的pexpect模块

    Pexpect 是 Don Libes 的 Expect 语言的一个 Python 实现,是一个用来启动子程序,并使用正则表达式对程序输出做出特定响应,以此实现与其自动交互的 Python 模块. P ...

  7. [python]使用pexpect模块进行批量scp

    #!/usr/bin/env python# -*- coding: utf-8 -*- #wangxiaofei #awcloud自动化测试 import time,osimport threadi ...

  8. Python模块之pexpect

    一.pexpect模块介绍 Pexpect使Python成为控制其他应用程序的更好工具.可以理解为Linux下的expect的Python封装,通过pexpect我们可以实现对ssh,ftp,pass ...

  9. python基础之常用模块一(sys、greenlet、pymysql、paramiko、pexpect、configparser)

    一.sys模块(内置模块) 用于提供对解释器相关的操作 import syssys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) ...

随机推荐

  1. Ansible的使用和模块化深入

    Ansible配置 配置文件:/etc/ansible/ansible.cfg [default] 默认配置 inventory = /etc/ansible/hosts主机清单 library = ...

  2. C++图书馆管理系统项目中部分功能代码实现(书籍推荐)

    bool UserServiceImpl::Compare1(Book b1,Book b2)//按照借阅次数比较{ if(b1.GetCnt() > b2.GetCnt()) { return ...

  3. PHP CURL错误: error:140943FC

    使用PHP访问https网站的时候,间歇性会报error:140943FC错误.google之,通过如下方案可处理: 1.服务器ssl版本较高 curl_setopt($this->curl, ...

  4. 双击内容变input框可编辑,失去焦点后修改的数据异步提交

    <html> <head> <meta charset="utf8"> <script src="https://cdn.boo ...

  5. 让Python带你看一场唯美的横飘雪!

    “北国风光,千里冰封,万里雪飘”,这句诗描写了一句美丽肃静的风光图,恰逢昨天笔者这边也下了一场比较大的雪,要不今天就用Python带大家也来领略一次美丽的雪景? 开发环境 版本:Python3.6 系 ...

  6. 如何在微信中发送"相册"文件时有选择性地显示视频文件

    相信很多微信用户在使用微信给朋友,同事发送相册中的文件时,微信会显示你手机中的视频文件,这样很不方便. 如果要完全不显示视频文件: 随便在手机中建立一个文件夹,名字叫 ".nomedia&q ...

  7. MediaStore类的使用

    安卓系统会在每次开机之后扫描所有文件并分类整理存入数据库,记录在MediaStore这个类里,通过这个类就可以快速的获得相应类型的文件. 当然这个类只是给你一个uri,提取文件的操作还是要通过Curo ...

  8. Java-创建一个线程

    第一种继承Thread类 package com.tj; public class BasicThread1 extends Thread { public void run() { System.o ...

  9. luogu3388 【模板】割点(割顶)

    模板题 #include <iostream> #include <cstdio> using namespace std; struct Edge{ int too, nxt ...

  10. 栈的push、pop序列 【微软面试100题 第二十九题】

    题目要求: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1.2.3.4.5是某栈的压栈序列,序列4.5.3.2.1是该压栈 ...