python paramikoマルチスレッドリモート実行コマンド、マルチスレッドリモートアップロードファイル、マルチスレッドリモートダウンロードファイルを実現


python paramikoマルチスレッドリモート実行コマンド、マルチスレッドアップロードファイル、マルチスレッドダウンロードファイルを実現
最近内部のサーバーはテストがあって、いくつかファイルを更新して修正する必要があって、サーバーが比較的に少ないため、以前のいくつかの技術を使いたくなくて、そこで自分でpythonというスクリプトを書いて実現して、基本的な機能は実現することができて、最適化もしていません.もしどんな友达が必要ならば、自分で最適化して、分からないところは一緒に交流することができて、直接コードに行きます
# coding=utf8
import paramiko,datetime,os,threading
runing = True
class run_cmd(threading.Thread):
      def __init__(self,hostname=None,password=None,username=None,port=None,echo_cmd=None):
          threading.Thread.__init__(self)
          self.hostname=hostname
          self.password=password
          self.username=username
          self.port=port
          self.echo_cmd=echo_cmd
          self.thread_stop=False
      def run(self):
          paramiko.util.log_to_file('paramiko.log')
          s=paramiko.SSHClient()
          s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
          s.connect(hostname = self.hostname,username=self.username, password=self.password)
          stdin,stdout,stderr=s.exec_command(self.echo_cmd)
          print stdout.read()
          s.close()
      def stop(self):
           self.thread_stop=True
class upload_thread(threading.Thread):
    def __init__(self,hostname=None,password=None,username=None,port=None,local_dir=None,remote_dir=None):
        threading.Thread.__init__(self)
        self.hostname=hostname
        self.port=port
        self.username=username
        self.password=password
        self.local_dir=local_dir
        self.remote_dir=remote_dir
        self.thread_stop=False
    def run(self):
        try:
                   t=paramiko.Transport((self.hostname,self.port))
                   t.connect(username=self.username,password=self.password)
                   sftp=paramiko.SFTPClient.from_transport(t)
                   print 'upload file start %s ' % datetime.datetime.now()
                   for root,dirs,files in os.walk(self.local_dir):
                        for filespath in files:
                            local_file = os.path.join(root,filespath)
                            a = local_file.replace(self.local_dir,remote_dir)
                            remote_file = os.path.join(self.remote_dir,a)
                            try:
                               sftp.put(local_file,remote_file)
                            except Exception,e:
                               sftp.mkdir(os.path.split(remote_file)[0])
                               sftp.put(local_file,remote_file)
                            print "upload %s to remote %s" % (local_file,remote_file)
                        for name in dirs:
                           local_path = os.path.join(root,name)
                           a = local_path.replace(self.local_dir,remote_dir)
                           remote_path = os.path.join(self.remote_dir,a)
               try:
                              sftp.mkdir(remote_path)
                              print "mkdir path %s" % remote_path
                           except Exception,e:
                              print e
                   print 'upload file success %s ' % datetime.datetime.now()
                   t.close()
                except Exception,e:
                   print e
    def stop(self):
        self.thread_stop=True
class get_thread(threading.Thread):
    def __init__(self,hostname=None,password=None,username=None,port=None,local_dir=None,remote_dir=None):
        threading.Thread.__init__(self)
        self.hostname=hostname
        self.port=port
        self.username=username
        self.password=password
        self.local_dir=local_dir
        self.remote_dir=remote_dir
        self.thread_stop=False
    def run(self):
        try:
            t=paramiko.Transport((self.hostname,self.port))
            t.connect(username=self.username,password=self.password)
            sftp=paramiko.SFTPClient.from_transport(t)
            print 'get file start %s ' % datetime.datetime.now()
            for root,dirs,files in os.walk(self.remote_dir):
                for name in dirs:
                    remote_path = os.path.join(root,name)
                    a = remote_path.replace(self.remote_dir,local_dir)
                    local_path = os.path.join(self.local_dir,a)
                    try:
                        sftp.mkdir(local_path)
                        print "mkdir path %s" % local_path
                    except Exception,e:
                        print e
                for filespath in files:
                    remote_file = os.path.join(root,filespath)
                    a = remote_file.replace(self.remote_dir,self.local_dir)
                    local_file = os.path.join(self.local_dir,a)
                    try:
                        sftp.get(remote_file,local_file)
                    except Exception,e:
                        sftp.mkdir(os.path.split(local_file)[0])
                        sftp.get(remote_file,local_file)
                    print "get %s to remote %s" % (remote_file,local_file)
            print 'get file success %s ' % datetime.datetime.now()
            t.close()
        except Exception,e:
            print e
    def stop(self):
        self.thread_stop=True
               
while runing:
    print  "1   cmd  "
    print  "2     "
    print  "3     "
    print  "* quit"
    ten = int(raw_input('Enter a number:'))
    if type(ten) is not int:
       break
    else:
         if ten == 1:
            while runing:
               print "1       "
               print "*(    )       "
               cmd_number = int(raw_input('Enter a number(  ):'))
               if cmd_number == 1:
                  username='root'
                  password='redhat'
                  port=22
                  echo_cmd=raw_input('Enter echo cmd:')
                  ip=raw_input('enter hostname:')
                  host=ip.split(' ')
                  for hostname in host:
                    cmd_thread=run_cmd(hostname,password,username,port,echo_cmd)
                    print hostname
                    cmd_thread.start()
                    cmd_thread.stop()
                    if (cmd_thread.isAlive()):
                         cmd_thread.join()
               else:
                  break
         elif ten == 2:
            while runing:
              print "1     "
              print "*(    )       "
              file_put = int(raw_input('Enter a number(    ):'))
              if file_put == 1:
                  local_dir = raw_input('enter     :')
                  remote_dir = raw_input('enter     :')
                  host = []
                  ip=raw_input('enter hostname:')
                  host=ip.split(' ')
                  username='root'
                  password='redhat'
                  port=22
                  for hostname in host:
                    print hostname
            uploadthread=upload_thread(hostname,password,username,port,local_dir,remote_dir)
            uploadthread.start()
            uploadthread.stop()
                       
            if (uploadthread.isAlive()):
                         uploadthread.join()
                                
              else:
                  break
         elif ten == 3:
             while runing:
              print "1     "
              print "*(    )       "
              file_get = int(raw_input('Enter a number(    ):'))
              if file_get == 1:
                  username='root'
                  password='redhat'
                  port=22
                  remote_dir= raw_input('enter        :')
                  local_dir= raw_input('enter      :')
                  hostname=raw_input('enter              :')
                  getthread=get_thread(hostname,password,username,port,local_dir,remote_dir)
                  getthread.start()
                  getthread.stop()
                  if (getthread.isAlive()):
                      getthread.join()
              else:
                  break
         else:
              break

ここのユーザーは私の判断を入力して完璧ではありませんて、数字かどうかを判断して、入力が空いているかどうかを判断して、私はすべてしていませんて、これらは比較的に簡単で、私は多く言わないで、いくつかの友达を助けることができることを望みます