美文网首页
pexpect初次挖坑

pexpect初次挖坑

作者: 六十三63 | 来源:发表于2018-04-12 00:02 被阅读0次

好久不写Python脚本了,今晚写碰到很多坑。

该篇文章没有什么参考价值,仅做次记录

需求是有一堆服务器,要执行一条命令把返回结果和服务器并行显示。本身已经有工具的,但是我总想减少其中某些过程

脚本如下,执行环境为docker python3容器

[vagrant@amainst python3]$ sudo docker exec -it 24ebede9724d cat /tmp/expecttest.py
#!/usr/bin/python
#conding=utf8

import pexpect
#import getpass2
import sys

def onelinecmd(userid, pwd, host, cmd):
   child = pexpect.spawn('ssh ' + userid + '@' + host + ' ' + cmd)
   file = open('/tmp/log','wb')
   child.logfile = file
   index = child.expect(['[Pp]assword','(yes/no)'])
   if index == 0:
      child.sendline(pwd)
   elif index == 1:
      child.sendline('yes')
      child.expect('[Pp]assword')
      child.sendline(pwd)
   child.expect(pexpect.EOF)
   file.close()
   file = open('/tmp/log','r')
   content = file.read()
   conlist = content.split('\n')
   while '' in conlist:
      conlist.remove('')
   print(host + ' : ' + conlist[-1])
   file.close()

if __name__ == '__main__':
   userid = 'vagrant'
   pwd = 'vagrant'
   hosts = ['192.168.8.82', '192.168.8.83']
   cmd = 'uname -n'
   for host in hosts:
      onelinecmd(userid, pwd, host, cmd)

执行效果如下

[vagrant@amainst python3]$ sudo docker exec -it 24ebede9724d python /tmp/expecttest.py
192.168.8.82 : anodest01
192.168.8.83 : anodest02

坑点有

docker 宿主机与容器之间如何传文件

[vagrant@amainst python3]$ sudo docker cp expecttest.py 24ebede9724d:/tmp
简单的说就是
docker cp 宿主机文件路径 容器ID:容器内路径

如何不进入容器靠容器内的命令执行

[vagrant@amainst python3]$ sudo docker exec -it 24ebede9724d python /tmp/expecttest.py
简单的说就是
docker exec -it 容器ID 命令

需要改进的地方

getpass2这个密码输入的模块在Python3里导入失败,被我注释了

显示结果用了很蠢的logfile写,读文件。耗费主机资源

循环执行,浪费时间

由于工作环境的机器没有装python,所以不考虑fabric。再说fabric python3版本不知道上线没有。

相关文章

网友评论

      本文标题:pexpect初次挖坑

      本文链接:https://www.haomeiwen.com/subject/zjytkftx.html