怎么在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 命令组成一个提取日志文件的命令
然后使用句柄对象发送这条命令
最后,对返回内容进行清洗即可
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。