用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
在控制服务器端编译安装第三方模块包:
#脚本内容展示
#执行脚本
#日志文件
准备工作: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动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- install and upgrade scrapy
- Scrapy的架构介绍
- Centos6 编译安装Python
- 使用Python生成Excel格式的图片
- 让Python文件也可以当bat文件运行
- [Python]推算数独
- Python中zip()函数用法举例
- Python中map()函数浅析
- Python将excel导入到mysql中
- Python在CAM软件Genesis2000中的应用
- 使用Shiboken为C++和Qt库创建Python绑定
- FREEBASIC 编译可被python调用的dll函数示例
- Python 七步捉虫法