需求:

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()



目录展示:

wKiom1e-k9OR_ITvAAAUWbhVc90508.png-wh_50



执行脚本展示:

wKiom1e-lW_ACMftAACOSeffsW8431.png-wh_50



错误命令输入:

wKiom1e-ljaikiGJAAAY8krWwB8351.png-wh_50



再次查看当前目录:

wKioL1e-mkfwSln8AAB4CdRx9R4344.png-wh_50