python 基于windows环境的ftp功能

描述:

1、基于备份服务器部署的py程序,将需要备份主机目录下的内容下载至备份服务器(服务端和远端都是windows server 2008)

2、py程序部署在windows服务器,后台运行,基于bat脚本启停程序

FTP代码:

  1 class Windows_ftp(object):
  2     '''
  3     FTP类,基于ftplib模块实现
  4     connect: 连接
  5     login: 登陆
  6     DownLoadFile: 下载文件
  7     DownLoadFileTree: 下载指定目录下的所有文件和目录
  8     UpLoadFile: 上传文件
  9     UpLoadFileTree: 上传指定目录下的所有文件和目录
 10     isDir: 判断是否为目录
 11     cwd: 变更目录
 12     quit: 退出
 13     '''
 14     ftp = ftplib.FTP()
 15     bIsDir = False
 16     path = ""
 17 
 18     def __init__(self, host, port, username, password):
 19         self.host = host
 20         self.port = port
 21         self.username = username
 22         self.password = password
 23         self.buffer = 4096  # 设置的缓冲区大小
 24         self.ftp.set_debuglevel(0)  # 打开调试级别2,显示详细信息; 级别0关闭调试模式
 25 
 26     def connect(self):
 27         try:
 28             self.ftp.connect(self.host, self.port, timeout=10)
 29             logger.info('*** connected to host "%s"' % self.host)
 30             return True
 31         except Exception as err:
 32             logger.error('cannot reach "%s", %s' % (self.host, err))
 33             return False
 34 
 35     def login(self):
 36         try:
 37             self.ftp.login(self.username, self.password)
 38             logger.info('*** Login successfully "%s"' % self.username)
 39             return True
 40         except Exception as err:
 41             logger.error('cannot login, %s' % err)
 42             self.quit()
 43             return False
 44 
 45     def DownLoadFile(self, LocalFile, RemoteFile):
 46         file_handler = open(LocalFile, 'wb')
 47         self.ftp.retrbinary("RETR %s" % RemoteFile, file_handler.write, self.buffer)
 48         file_handler.close()
 49         return True
 50 
 51     def show(self, list):
 52         result = list.split(" ")
 53         #logger.debug(result)
 54         if self.path in result and "<DIR>" in result:
 55             self.bIsDir = True
 56 
 57     def isDir(self, path):
 58         self.bIsDir = False
 59         self.path = path
 60         #this ues callback function ,that will change bIsDir value
 61         self.ftp.retrlines('LIST', self.show)
 62         return self.bIsDir
 63 
 64     def DownLoadFileTree(self, LocalDir, RemoteDir):
 65         if os.path.isdir(LocalDir) == False:  # 判断本地主机是否存在目录,进行创建
 66             os.makedirs(LocalDir)
 67         try:
 68             self.cwd(RemoteDir)
 69         except Exception as err:
 70             logger.error("Failed to open the path to the remote host, %s" % err)
 71             return False
 72         RemoteNames = self.ftp.nlst()  # 列出远程下载目录下所有内容
 73         logger.debug("Remote downLoad path:%s, DownLoad files list:%s" % (RemoteDir, RemoteNames))
 74         for file_or_path in RemoteNames:
 75             Local = os.path.join(LocalDir, file_or_path)
 76             if self.isDir(file_or_path):
 77                 self.DownLoadFileTree(Local, file_or_path)
 78             else:
 79                 self.DownLoadFile(Local, file_or_path)
 80         self.ftp.cwd("..")
 81         return
 82 
 83     def cwd(self, DIRN):
 84         try:
 85             self.ftp.cwd(DIRN)
 86         except Exception as err:
 87             logger.error('ERROR:cannot CD to "%s"' % DIRN)
 88             logger.error(err)
 89             self.quit()
 90         logger.debug('*** changed to "%s" folder' % DIRN)
 91 
 92     def UpLoadFile(self, LocalFile, RemoteFile):
 93         if os.path.isfile(LocalFile) == False:
 94             return False
 95         file_handler = open(LocalFile, "rb")
 96         self.ftp.storbinary('STOR %s' % RemoteFile, file_handler, self.buffer)
 97         file_handler.close()
 98         return True
 99 
100     def UpLoadFileTree(self, LocalDir, RemoteDir):
101         if os.path.isdir(LocalDir) == False:
102             return False
103         LocalNames = os.listdir(LocalDir)
104         logger.debug("Remote upLoad path:%s, UpLoad files list:%s" % (RemoteDir, LocalDir))
105         self.cwd(RemoteDir)
106         for Local in LocalNames:
107             src = os.path.join(LocalDir, Local)
108             if os.path.isdir(src):
109                 self.UpLoadFileTree(src, Local)
110             else:
111                 self.UpLoadFile(src, Local)
112         self.ftp.cwd("..")
113         return
114 
115     def quit(self):
116         self.ftp.quit()
View Code

windows 下脚本

start.bat

 1 @echo off
 2 if exist ./var/hk_win_syncfile.pid (echo "[%date% %time%] Running.."
 3 ping -n 3 localhost >nul
 4 exit
 5 )else ( echo "[%date% %time%] Starting.."
 6 start pythonw hk_win_syncfile.py
 7 ping -n 3 localhost >nul
 8 status.bat
 9 ping -n 3 localhost >nul
10 )
View Code

stop.bat

1 @echo off
2  
3 if exist ./var/hk_win_syncfile.pid (echo "[%date% %time%] Stopping..."
4   python -c "import os; os.system('taskkill /F /PID %%s' %% open('./var/hk_win_syncfile.pid').read());"
5   del /s hk_win_syncfile.pid
6   ping -n 3 localhost >nul
7 )else (echo "[%date% %time%] Stopped.."
8 ping -n 3 localhost >nul
9 )
View Code

status.bat

1 @echo off
2 if exist ./var/hk_win_syncfile.pid (echo "[%date% %time%] Runningg...")else (echo "[%date% %time%] Stopped..")
3 ping -n 3 localhost >nul
View Code

restart.bat

 1 @echo off
 2 if exist ./var/hk_win_syncfile.pid (echo "[%date% %time%] Stopping..."
 3   python -c "import os; os.system('taskkill /F /PID %%s' %% open('./var/hk_win_syncfile.pid').read());"
 4   del /s hk_win_syncfile.pid
 5   ping -n 3 localhost >nul
 6 )else (echo "[%date% %time%] Stopped.."
 7 ping -n 3 localhost >nul
 8 )
 9  
10 if exist ./var/hk_win_syncfile.pid (echo "[%date% %time%] Running.."
11 ping -n 3 localhost >nul
12 exit
13 )else ( echo "[%date% %time%] Starting.."
14 start pythonw hk_win_syncfile.py
15 ping -n 3 localhost >nul
16 status.bat
17 ping -n 3 localhost >nul
18 )
View Code

 

你可能感兴趣的:(python 基于windows环境的ftp功能)