python命令行交互_Python命令行自动化交互模块:pexpect

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

一:基本函数和类

run 函数

#run 函数的定义

'''

withexitstatus:是否返回命令执行状态

events:自动化交互字典

logfile:定义命令输出打印位置(tty或者file)

'''

run(command,timeout=-1,withexitstatus=False,events=None, extra_args=None,logfile=None, cwd=None, env=None)

status 是命令执行的返回值

events 是一个字典,用来自动化交互,具体示例如下:

#########################################################################

# -*- coding:utf-8 -*-

# File Name: expect4.py

# Author: lcs

# Mail: liuchengsheng95@qq.com

# Created Time: 2017-09-28 15:04:54

# Description: 自动输入密码执行ssh命令

#########################################################################

# /usr/bin/python

import pexpect

import sys

pexpect.run('ssh lcs@192.168.1.12 ls -l /home/lcs', events={

# yes 是第一次 ssh 连接需要回复 "yes"

'yes':'yes',

'password:': '123456\n'

}, logfile=sys.stdout)

运行结果

spawn 核心类

class spawn:

'''

command:将要执行的命令

args:命令的参数

maxread:从tty一次读取的最大字节数

searchwindowsize:从开始开始匹配 expect 方法所匹配字符

logfile:日志文件的记录位置(tty或者file)

'''

def __init__(self,command,args=[],timeout=30,maxread=2000, searchwindowsize=None, logfile=None, cwd=None, env=None)

expect方法:等待子程序产生特定输出,做出特定的响应

expect(self, pattern, timeout=30, searchwindowsize=None)

pattern 可以是正则表达式, pexpect.EOF , pexpect.TIMEOUT ,或者由这些元素组成的列表。

需要注意的是,当 pattern 的类型是一个列表时,且子程序输出结果中不止一个被匹配成功,

则匹配返回的结果是缓冲区中最先出现的那个元素,或者是列表中最左边的元素。

使用 timeout 可以指定等待结果的超时时间 ,该时间以秒为单位。

当超过预订时间时, expect 匹配到pexpect.TIMEOUT。

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

具体实例:

#########################################################################

# -*- coding:utf-8 -*-

# File Name: xxx.py

# Author: lcs

# Mail: liuchengsheng95@qq.com

# Created Time: 2017-09-28 10:57:06

#########################################################################

# /usr/bin/python

import pexpect

import sys

def commands():

child.sendline('123456')

child.expect('\$')

child.sendline('ip addr | grep inet')

child.logfile = sys.stdout

child.expect('\$')

def ssh(hostinfo):

global child

child = pexpect.spawn('ssh {}'.format(hostinfo))

index = child.expect(['yes', 'password' ,pexpect.TIMEOUT])

if index == 0:

child.sendline('yes')

commands()

elif index == 1:

commands()

else:

print('TIMEOUT')

if __name__ == '__main__':

hostinfo = raw_input('Pls input ssh host, expmale(user@host -p port):')

ssh(hostinfo)

运行结果

Pxssh 类

Pxssh 做为 pexpect 的派生类可以用来建立一个 ssh 连接,它相比其基类增加了如下方法:

login() 建立到目标机器的ssh连接 ;

losuckgout() 释放该连接 ;

prompt() 等待提示符,通常用于等待命令执行结束

具体实例:

#########################################################################

# -*- coding:utf-8 -*-

# File Name: xssh.py

# Author: lcs

# Mail: liuchengsheng95@qq.com

# Created Time: 2017-09-30 15:22:58

# Description:

#########################################################################

#/usr/bin/python

from pexpect import pxssh

import getpass

try:

s = pxssh.pxssh()

host = raw_input('Hostname:')

user = raw_input('Username:')

passwd = getpass.getpass('Password:')

s.login(host,user,passwd)

s.sendline('uptime')

s.prompt()

print(s.before)

s.sendline('ls -l')

s.prompt()

print(s.before)

s.logout()

except pxssh.ExceptionPxssh, e:

print('pxssh failed on login.')

print(str(e))

运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值