需求:
1、用Python的多线程对主机组批量分发命令
2、需要有传送文件的功能
3、把输出的日志信息写到日志文件(包括正确输出日志,和错误输出日志,包含日志写入的时间)
准备工作:
1、把需要远程控制分发命令的机器(被控端)配置好ssh+key
2、下载第三方模块包
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 issue_comm.py #!/usr/bin/env python #coding:utf-8 import threading 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() if comd == '1': try: yuan = raw_input('请输入你源服务器文件文件的路径,如/opt/test.txt:') mb = raw_input('请输入你目标服务器存放文件的路径:如/opt/test1.txt:') except: sys.exit() #定义IP最后一位的初始值 num = 9 #日志文件 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 num global yuan global mb if comd == '1': #加锁 samp.acquire() #三台机器的IP地址 num += 1 ip='192.168.200.%s' %num t = paramiko.Transport((ip,22)) t.connect(username='root',pkey=key) sftp = paramiko.SFTPClient.from_transport(t) sftp.put(yuan,mb) t.close() #解锁 samp.release() else: #加锁 samp.acquire() #三台机器的IP地址 num += 1 ip='192.168.200.%s' %num ##连接相关信息 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 #输出正确和错误信息 print result_out print result_err #关闭ssh连接 ssh.close(); #解锁 samp.release() #最大同时执行的线程数为3 samp = threading.BoundedSemaphore(3) #创建三个线程 if __name__ == '__main__': for i in range(3): t = threading.Thread(target=run,args=(i,)) #启动多线程 t.start()
目录展示:
执行脚本展示:
错误命令输入:
再次查看当前目录: