python之pexpect模块

最近在看《Python自动化运维技术与最佳实战》这本书,学到了一个运维中用到的模块:pexpect

下面是其定义:

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

 

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

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

import pexpect
import sys

#通过spawn类启动和控制子应用程序
child = pexpect.spawn('ssh [email protected]')

#将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类

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

 
#events是一个字典,定义了expect和sendline的对应关系
pexpect.run('ssh [email protected]',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类

猜你喜欢

转载自blog.csdn.net/a1010256340/article/details/89880908