python pexpect总结
基本使用流程
pexpect 的使用说来说去,就是围绕3个关键命令做操作:
- 首先用 spawn 来执行一个程序
- 然后用 expect 来等待指定的关键字,这个关键字是被执行的程序打印到标准输出上面的
- 最后当发现这个关键字以后,根据关键字用 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