好久不写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版本不知道上线没有。
网友评论