您的位置:首页 > 编程语言 > Python开发

用Python多进程和paramiko给主机组批量分发命令和传送文件

2016-08-26 09:26 856 查看
需求:1、用Python的多进程对主机组批量分发命令2、需要有传送文件的功能3、把输出的日志信息写到日志文件(包括正确输出日志,和错误输出日志,包含日志写入的时间)
准备工作:1、把需要远程控制分发命令的机器(被控端)配置好ssh+key2、下载第三方模块包 pycrypto-2.6.tar.gz http://pan.baidu.com/s/1dFHSvcP paramiko-1.10.1.tar.gz http://pan.baidu.com/s/1hrWzg7y

在控制服务器端编译安装第三方模块包:
[root@test1 opt]# yum install gcc python-devel
[root@test1 opt]# tar xf pycrypto-2.6.1.tar.gz
[root@test1  opt]# cd pycrypto-2.6.1
[root@test1 pycrypto-2.6]# python setup.py build
[root@test1 pycrypto-2.6]# python setup.py install
[root@test1 pycrypto-2.6]# cd ..
[root@test1 opt]# tar xf paramiko-1.10.1.tar.gz
[root@test1 opt]# cd paramiko-1.10.1
[root@test1 paramiko-1.10.1]# python setup.py build
[root@test1 paramiko-1.10.1]# python setup.py install


#脚本内容展示
[root@test1 opt]# cat process_comd.py
#!/usr/bin/env python
#coding:utf-8
import threading
from multiprocessing import Pool
import paramiko
import time
import sys

while True:
try:
time.sleep(3)
comd = raw_input('请输入你要批量分发的命令(输入1传送文件):')
except:
sys.exit()
else:
#哪果输入为exit就退出系统
if comd == 'exit':
sys.exit()

#如果输入为1就进行交互
if comd == '1':
try:
yuan = raw_input('请输入你源服务器文件文件的路径,如/opt/test.txt:')
mb = raw_input('请输入你目标服务器存放文件的路径:如/opt/test1.txt:')
except:
sys.exit()
#日志文件
succ = '/opt/log.txt'
err = '/opt/error.txt'
def run(n):
#输入Key的路径
private_key_path = '/root/.ssh/id_rsa'
#获得key
key = paramiko.RSAKey.from_private_key_file(private_key_path)
#获取连接ssh方法
ssh = paramiko.SSHClient()
#允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#把局部变量设为全局变量
global yuan
global mb
#如果值等于1就传送文件
if comd == '1':
#三台机器的IP地址
ip='192.168.200.%s' %n
t = paramiko.Transport((ip,22))
t.connect(username='root',pkey=key)
sftp = paramiko.SFTPClient.from_transport(t)
result = sftp.put(yuan,mb)
return result
t.close()

else:
#三台机器的IP地址
ip='192.168.200.%s' %n
##连接相关信息
ssh.connect(hostname=ip, port=22, username='root', pkey=key)
#执行命令
stdin, stdout, stderr = ssh.exec_command(comd)
#获取执行命令的时间
sj = time.strftime('%Y-%m-%d %H:%M:%S')
#打开正确和错误日志文件
f = open(succ,'ab')
e = open(err,'ab')
#读进正确和错误信息
result_out = stdout.read()
result_err = stderr.read()
#把正确和错误信息写到日志文件
if result_err:
e.write(sj+'\n')
e.write(result_err+'\n')
e.close
else:
f.write(sj+'\n')
f.write(result_out+'\n')
f.close
#输出正确和错误信息
return result_out
return result_err
#关闭ssh连接
ssh.close();
#最大同时执行的进程数为3
pool = Pool(processes=3)
#创建一个空列表
res_list = []
#创建三个进程
if __name__ == '__main__':
for i in range(10,13):
res = pool.apply_async(run, [i,])
#往空列表添加值
res_list.append(res)
#启动多进程
for r in res_list:
print r.get()


#执行脚本




#日志文件



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python