怎么在python中利用pexpect库自动获取日志信息

  介绍

怎么在python中利用pexpect库自动获取日志信息吗?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。


pexpect是python语言实现的类,期望的一种实现,通过产生子应用程序并控制它们,通过期望模式对子应用程序的输出做出相应处理

项目地址:https://github.com/pexpect/pexpect/tree/5eed1a31a2853a09b7367c59fbd1a4a0b53341df

它主要对人机对话进行模拟,来实现一些自动化的场景

比如:用来和,SSH, FTP, PASSWD, Telnet 等命令行程序进行自动化交互

在使用之前,我们先安装依赖包

#,安装依赖库   pip3  install  pexpect

3。实战一下

我们以从服务器k8容器获取日志为例进行讲解

3-1  SSH登录

首先,初始化使用pexpect模拟SSH远程登录服务器

import  pexpect      PROMPT =,(& # 39; #, & # 39;,, & # 39;在祝辞祝辞,& # 39;,,& # 39;祝辞,& # 39;,,& # 39;\ $,& # 39;】      def  login_with_pexpect ():   ,,,,,,   ,,,登录-pexpect   ,,,:返回:   ,,,,,,   ,,,#,端口号   ,,,port =* *      ,,,#,用户名   ,,,user =* *      ,,,#,密码   ,,,pwd =* *      ,,,#,ip地址   ,,,ip =* *      ,,,ssh_cmd =,“ssh  -p  {}, {} @ {}“.format(端口、用户、ip)      ,,,#,指定登录命令,拿到程序操作句柄   ,,,child =, pexpect.spawn (ssh_cmd,超时=60,编码=& # 39;utf - 8 # 39;)      ,,,#,提示输入密码的字符出现,否则超时   ,,,ret =, child.expect ([pexpect.TIMEOUT, & # 39; [P | P] assword:, & # 39;],,超时=10)      ,,,#,匹配成功后,输入密码,执行登陆操作   ,,,if  ret ==, 1:   ,,,,,,,#,发送密码   ,,,,,,,child.sendline (pwd)   ,,,,,,,child.expect(提示)   ,,,,,,,return 儿童   ,,,:   ,,,,,,,印刷(& # 39;登录失败! & # 39;)

其中

pexpect.spawn():用于执行一个程序,并返回一个操作句柄

该方法常见的3个参数如下:

<李>

第一个参数是待执行的命令

<李>

第二个参数指定超时时间,程序执行后的输出检查,如果指定时间内没有匹配到结果,就会抛异常

<李>

第三个参数用于设置编码格式

child.expect(),:对输出结果,利用正则表达式进行关键字匹配

代码中的含义是在10秒内等待出现关键字,& # 39;[p | p] assword:, & # 39;

最后,如果匹配的结果为1,使用,sendline()方法发送带回车符的字符串,模拟密码的输入,完成登录操作

3-2 ,封装发送命令

接下来,我们将操作句柄发送命令进行一次封装,并获取返回结果

def  send_command (cmd,孩子,,expected_content=没有,超时=10):   ,,,,,,   ,,,发送一条命令,并打印结果   ,,,:param  expected_content:   ,,,:param 孩子:   ,,,:param  cmd:   ,,,:返回:   ,,,,,,   ,,,#,发送一条命令   ,,,if  expected_content  is 没有:   ,,,,,,,expected_content =, (“#”)      ,,,child.sendline (cmd)      ,,,#,期望有命令行提示字符出现   ,,,child.expect (expected_content,超时=超时)      ,,,#,将之前的内容都输出   ,,,result =child.before      ,,,return 结果

需要指出的是,孩子。之前用于获取到匹配到关键字为止,缓存里面已有的全部数据

3-3 进入容器pod日志目录

使用上面的方法,通过,kubectl进入到对应的容器日志目录

#,登录舱容器   时间=exec_enter_pod  & # 39; kubectl  -n  % s  exec  -it  % s , bash # 39;, %, (env, pod_name)      #,进入容器   send_command(孩子,exec_enter_pod)      #,进入到日志目录   send_command(孩子,“cd  logs",, expected_content=& # 39; tomcat/日志# & # 39;)

3-4 ,获取日志内容

最后我们只需要组成获取日志的命令

比如:使用,grep/tail 命令组成一个提取日志文件的命令

然后使用句柄对象发送这条命令

最后,对返回内容进行清洗即可

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

怎么在python中利用pexpect库自动获取日志信息