python非常厉害的一门编程语言,被称之为编程语言中的万能粘合剂,它可以和现有的大部分编程语言来完美对接,今天来为大家说说使用python写一个从ftp上下载文件,然后通过python的多线程模块threading同时分发到多台机器,甚至上百台机器上,多了不说了,直接上代码,代码里会详细讲解每一步的操作。

  可根据你的实际情况来修改脚本,实现多线程远程无缝隙操作服务器。


#!/usr/bin/python
#coding: utf-8
#加载我们需要使用到的模块
from ftplib import FTP
import tarfile
import sys
import threading
import paramiko
import os
import datetime
import time
#paramiko 模块需要自己在网上下载下,根据不同的版本来下载
exitFlag = 0
reload(sys)
sys.setdefaultencoding("gbk")

#连接FTP函数
def ftpconnect(host,username,password):
  ftp = FTP()            #实例化FTP模块
  ftp.set_debuglevel(2)  #打开调试模式。等级为2,显示详细信息
  ftp.connect(host,21)   #连接ftp服务器
  ftp.login(username,password) #登录FTP服务器
  
  return ftp  #返回状态

#下载文件
def downlocadfile(ftp,remotepath,localpath):
  bufsize = 1024  #设置缓冲块大小
  fp = open(localpath,'wb')  #以写的模式打开本地文件
  ftp.retrbinary('RETR ' + remotepath,fp.write,bufsize) #接收服务器上文件并写入本地文件
  ftp.set_debuglevel(0) #关闭调试
  fp.close()  #关闭文件

#上传文件
def uploadfile(ftp,remotepath,localpath):
  bufsize = 1024   #设置缓冲块大小
  fp = open(localpath, 'rb')  #以只读的模式在本地打开文件
  ftp.storbinary('STOR ' + remotepath, fp, bufsize)  #上传文件
  ftp.set_debuglevel(0)  #关闭调试模式
  fp.close()  #关闭文件

#多线程同时向多台机器发送操作请求的class
class myThread (threading.Thread):   #必须继承父类threading.Thread,
    def __init__(self, hostname, filename):    #self代表的是class本身,hostname和filename是传的参数
        threading.Thread.__init__(self)        #每次调用这个class的时候,都初始化下这两个参数
        self.hostname = hostname               #设置成其他函数也可以调用的属性
        self.filename = filename
    def run(self):                   #把要执行的代码写到run函数里面 线程在创建后会直接运行run函数 
        username=''              #机器的账号
        password=''   #机器的密码
        port=                   #机器的ssh端口
        local_file='/home/mf/%s' % self.filename    #本地文件
        remote_file='/home/mf/%s' % self.filename   #你想要将文件传到对方机器的什么路径
        t=paramiko.Transport((self.hostname,port))       #类实例化
        t.connect(username=username,password=password)   #远程连接服务器
        sftp=paramiko.SFTPClient.from_transport(t)       #使用(t)的设置方式连接主机
    #        files=sftp.listdir(dir_path)
        #files=os.listdir(local_dir) 
        #for f in files: 
        print ''
        print '#########################################'
        print 'Beginning to upload file %s ' % datetime.datetime.now()   #打印连接状态及时间
        #print 'Uploading file:',os.path.join(local_dir,f)      
        print 'Uploading file:',local_file
               # sftp.get(os.path.join(dir_path,f),os.path.join(local_path,f)) 
        sftp.put(local_file,remote_file)
    
        print 'Upload file success %s ' % datetime.datetime.now()
        print ''
        print '##########################################'


# 创建新线程

if __name__ == "__main__":
  try:
    remotefile = raw_input('输入FTP你要下载的文件:').strip()    #输入你要下载的文件名称
    localfile = str(raw_input('输入存放在本地的文件名称最好和FTP上的文件名字相同:').strip())   #输入你要存在本地后的文件名
    remote_file = remotefile.decode('utf8','ignore')    #设置文件字符编码
    ftp = ftpconnect('ftp_ip','ftp_user','ftp_pwd')     #连接FTP
    downlocadfile(ftp,remote_file,"/home/mf/%s" % localfile)   #下载文件到本地
    ftp.quit()   #关闭FTP
     
	#现在将文件使用多线程的方式传输到多台服务器甚至上百上千台服务器上。
	selects = raw_input('输入传输文件:')   #输入你要传输的文件名称
    #ip_list = []   #ip地址表
	
	#在这里可以使用循环来实现,由于鄙人时间不足,没时间好好想了,有大神想出来的话,烦请告知谢谢。
	thread1 = myThread(ip[0], selects)  # 创建新线程
	thread1.start()  # 开启线程
	
  except Exception, e:
  	print e