本文基于《Python之——系统批量运维管理器pexpect》,请先阅读《Python之——系统批量运维管理器pexpect》
在Linux系统集群中,通常需要批量远程执行Linux命令,并且双向同步文件的操作,本文通过使用spawn()方法执行ssh、scp命令的思路实现,具体代码如下:
# -*- coding:UTF-8 -*-
'''
Created on 2018年1月9日
@author: liuyazhuang
'''
import pexpect
import sys
from com.lyz.chapter5.sshfile import fout
#定义目标主机
ip = "192.168.209.121"
#定义目标用户
user = "root"
#目标密码
passwd = "sfsdhfsdhd"
#目标主机nginx日志文件
target_file = "/data/logs/nginx_access.log"
#运行ssh命令
child = pexpect.spawn('/usr/bin/ssh', [user+'@'+ip])
#输入、输出日志写入mylog.txt
fout = file('mylog.txt', 'w')
child.logfile = fout
try:
#匹配password字符串,(?i)表示不区别大小写
child.expect('(?i)password')
child.sendline(passwd)
child.expect('#')
child.sendline('tar -czf /data/nginx_access.tar.gz' + target_file)
child.expect('#')
print child.before
child.sendline('exit')
fout.close()
#定义EOF异常处理
except EOF:
print "expect EOF"
#定义timrout异常处理
except TIMEOUT:
print 'except timeout'
#启动scp远程拷贝命令,实现将打包好的nginx日志复制到本地/home目录
child = pexpect.spawn('/usr/bin/scp', [user + "@" + ip + ':/data/nginx_access.tar.gz','/home'])
fout = file('mylog.txt', 'a')
child.logfile = fout
try:
child.expect('(?i)password')
child.sendline(passwd)
#匹配缓冲区EOF(结尾),保证文件复制正常完成
child.expect(pexpect.EOF)
#定义EOF异常处理
except EOF:
print "expect EOF"
#定义timrout异常处理
except TIMEOUT:
print 'except timeout'