文档章节

用Python写一个ftp下载脚本

皮子喜欢打篮球
 皮子喜欢打篮球
发布于 2015/08/06 10:30
字数 1276
阅读 898
收藏 8

Python写一个ftp下载脚本

----基于Red Hat Enterprise Linux Server release 6.4 (Santiago);python 2.6.6

Ps:少侠我接触Python半个月以来接到的第一个需求,虽然如此简单的一个脚本,少侠我磕磕绊绊却用了将近一天半的时间才写出来,但还是很开心,毕竟也粗来了,废话不多说,切入正题。因为一开始没有用过ftplib模块,所以各种谷歌度娘一堆资料杂乱不堪,话不清,理不乱的,本文实现的功能简单,下面介绍一下,以免误导读者。

需求:师傅给了一个需求,写一个ftp自动下载的脚本。似乎下载文件没什么难的,用ftp下载文件似乎更简单,getmget完事。但是需求是,服务器上主要是dat文件在备份,当备份完成后,会生成一个同名字的ack文件,要把备份完成的dat文件下载到本地,然后删除云端服务器的ackdat文件。虽然听着这个需求挺找抽,也挺容易实现的,但谁叫我是菜鸟呢,当时就蒙圈了。

  ftp地址192.168.213.129

用户名dmp    

密码zcxc123!

文件位置/var/ftp/pub/pizi

我看了下大概3分钟生成一个文件,文件忙时可能要60M以上,网管网估计悬,师父让我先写脚本,回头联系拉内网走。吐槽完毕,开始上干货:

----------------------------------------------分隔线---------------------------------------------

下面正式切入正题:

1.       首先要引入ftplib模块,Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件。网上有很多远程登录的实例,下面写一种最适合菜鸟的写法

2.       基本的代码如下:

from ftplib import FTP

###引入ftp模块

import re

###引入re模块使Python拥有全部的正则表达式的功能

ftp = FTP(‘目的主机的ip地址’)

####连接ftp服务器

ftp.login(‘user’,’passwd’)

###登录ftp服务器

ftp.cwd(‘ftp存放文件的路径’)

###设置一个你要登录的目录,下载上传文件都在此目录

ftp.nlst()

###获取目录下的文件

file_handle=open(filename,"wb").write

###以写模式在本地打开文件

ftp.retrbinary("RETR filename.txt",file_handel,bufsize)

###下载ftp文件

ftp.deletefilename

###删除ftp服务器上的文件

3.       下面粘上我的代码

#!/usr/bin/python

#coding=utf-8

import re

import os

from ftplib import FTP

os.chdir('更改的当前目录,因为默认下载到当前目录,这样就可以下载到自己制定的目录‘)

ftp = FTP('192.168.213.129')

ftp.login('root','westos')

print 'welcome'

print ftp.getwelcome()

ftp.cwd('/var/ftp/pub/pizi')

bufsize=1024    #设置缓冲块大小

list = ftp.nlst()   #获得一个当前目录文件的的列表

for name in list:         #用一个for循环取列表中的元素

        print (name)

        match = re.match(r'(.*)\.ack$',name)      #匹配去除的元素,用正则

        if match:       

                a = match.group(1)   #如果匹配成功,取出.ack前面的文件名

                if (a + ".dat"):   #然后在查看是否有同名字的.dat文件 

                        b=a.split('-') 

                        ###将a按-分割
                        
b[6]=time.strftime('%H%M',time.localtime(time.time()))

                        ###获取当前的时间 年月,将下标为6的元素替换

                        c='-'.join(b)

                        ###将b按-合并成字符串

                        ftp.retrbinary("RETR %s"%a+".dat",open(c+".dat",'wb').write)

                                        #如果两文件都存在,下载.dat文件,并且open里边的wb参数可以更改

                                        #wb是以二进制模式下载,wt是以ASCII模式下载

                      ftp.delete(name)

                                                         #删除匹配上的.ack文件

                      ftp.delete(a + ".dat")

                                                         #删除匹配上的.dat文件

       else:

                continue

ftp.quit()

print "ftp down ok"

4.       登录ftp服务器的方法有很多,并且匹配在此可以不用正则,用spilt分割可能更简单,方法有很多,能实现就行。

5.现在粘上加入异常捕捉后的代码

     #############################################
# Name: Ftp download
# Author: LCY
# Version: 1.0.20150826
# Feature: Download and determine if you are downloading.If you are downloading, exiting the script.
#############################################
#!/usr/bin/python
#coding=utf-8
import ftplib  
import os  
import socket  
import sys  
import re
import time
#os.chdir('/cstreaming/impalacsv')
#HOST = 'IP'  
#DIRN = '/DRITARY'   
#USER_NAME = 'NAME'  
#PWD = 'PASSWD'  
os.chdir('/root/Desktop')
HOST = '172.16.10.129'
DIRN='/var/ftp/pub/pizi'
USER_NAME='root'
PWD='westos'  
def DownloadFile():  
    try:  
        f = ftplib.FTP(HOST)  
    except(socket.error, socket.gaierror) as e:  
        print('ERROR:cannot reach %s' % HOST)  
        return  
    print('*** Connected to host %s' % HOST)  


    try:  
        f.login(USER_NAME, PWD)  
    except ftplib.error_perm:  
        print('ERROR:cannot login USER_NAME=%s, PWD=%s' % (USER_NAME, PWD))  
        f.quit()  
        return  
    print('*** Logined in as %s' % USER_NAME)  
  
    try:  
        f.cwd(DIRN)  
    except ftplib.error_perm:  
        print('ERROR:cannot CD to %s' % DIRN)  
        f.quit()  
        return  
    try:  
        list = f.nlst()
        for file_name in list:
            match = re.match(r'(.*)\.dat$',file_name)
            if match:
                a = match.group(1)
                b=a.split('-')
                # b[4]=time.strftime('%Y%m%d%H%M',time.localtime(time.time()))
                # b[4]='20'+b[4]
                timeArry = time.strptime(b[4],"%y%m%d%H%M")
                otherStyleTime = time.strftime("%Y%m%d%H%M",timeArry)
                b[4]=otherStyleTime
                g=b[4]+"-"+b[3]+"-"+b[0]+"-"+b[1]+"-"+b[2]+".DAT"
                f.retrbinary("RETR %s"%a+".dat",open(g,'wb').write)
                f.delete(file_name)
                print "Ftp file Downloaded success"
            else:
                continue
    except ftplib.error_perm:  
        print('ERROR:cannot read file %s' % file_name)  
        os.unlink(file_name)  
        #file.close()  
    else:  
        print('*** Downloaded %s to %s' % (file_name, os.getcwd()))  
    f.quit()  
    return 


def is_Running(process):
    try:
        pids = os.popen("ps -ef | egrep 'python.*%s' | grep -v grep | awk '{print $2}' " % process)
        for pid in pids.readlines():
            if pid != '' and int(pid) != os.getpid():
                return True
        return False
    except Exception,e:
        return False


if __name__ == '__main__':
    if is_Running('back_newftp.py'):
        print 'back_newftp is running ,exit.'
        exit(1)
    else:
        print 'start back_newftp.py'
    DownloadFile()  




 

                                                                                             新浪微博

                                                                                        @皮子喜欢打篮球


© 著作权归作者所有

共有 人打赏支持
上一篇: ssh公钥私钥
皮子喜欢打篮球
粉丝 2
博文 14
码字总数 8442
作品 0
沧州
私信 提问
国内顶尖白帽子用Python打造渗透工具集,当时花上万购买都被拒!

前言 python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天我们就来谈谈python在渗透测试中的应用,让我们自己动手打造自己的渗透工具集。 一、信息搜集--py端口扫描小脚本...

诸葛青云999
2018/08/18
0
0
Centos 6.3 安装 node.js

1、在根目录下新建一个目录 /down,用来保存下载的文件 # mkdir /down cd /down 2、安装 node.js 相关软件 首先要安装 gcc gcc-g++ openssl-devel # yum install gcc gcc-g++ openssl-devel ...

foxidea
2012/11/07
0
2
10 个平板电脑上的 Python 编辑器

本文介绍 10 个可在 iOS 或 Android 平板电脑上的 Python 编程环境。Python 开发者可通过这些工具实现随时随地编码,蛋疼抑或爽极? Pythonista Python 声称将实现 “在你的iPad或iPhone实现...

oschina
2013/05/01
27.9K
20
Python + Selenium 登录QQ邮箱

Python + Selenium 自动化登录QQ邮箱 准备工作 Windows或则Linux 安装Python 安装Selenium 安装Chrome Driver 环境选择Windows 10 安装Python Windows下安装 python 3.7.0 (因为python 2和p...

迷你芊宝宝
2018/07/02
0
0
Python 发布 2.7 的第二个 alpha 版本

Python (发音:[ 'paiθ(ə)n; (US) 'paiθɔn ]n.蟒蛇,巨蛇 ),是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。...

红薯
2010/01/10
408
1

没有更多内容

加载失败,请刷新页面

加载更多

分布式事务解决方案框架(LCN)

什么是XA接口 XA是一个分布式事务协议,由Tuxedo提出。XA中大致分为两部分:事务管理器和本地资源管理器。其中本地资源管理器往往由数据库实现,比如Oracle、DB2这些商业数据库都实现了XA接口...

群星纪元
12分钟前
0
0
linux 操作系统 常用命令和软件安装

1.系统时间更新 ntpdate time.windows.com 2.传送文件 rsync -av /home/data/a.dat -e ssh root@192.168.0.100:/home 3.传送文件夹 scp -r /home/data root@192.168.0.100:/home 4.JDK安装 ......

WJtiny
34分钟前
0
0
pg_lightool基于basebackup的单表恢复和块恢复

开源软件pg_lightool,实现了基于wal日志的块恢复。详情参见博客:https://my.oschina.net/lcc1990/blog/1931485。由于wal日志中FPW的不确定性,它不能作为一个数据库恢复的解决方案。目前对...

movead
42分钟前
2
0
对比剖析Swarm Kubernetes Marathon编排引擎

Docker Native Orchestration 基本结构 Docker Engine 1.12 集成了原生的编排引擎,用以替换了之前独立的Docker Swarm项目。Docker原生集群(Swarm)同时包括了(Docker Engine \/ Daemons)...

Linux就该这么学
43分钟前
2
0
Mybatis的结果集处理

此时我们已经可以把整段的SQL语句取出,但还并没有在数据库中去执行,我们可以先来分析一下配置文件中SQL语句执行后的结果集是如何处理的。 Mybatis会将结果集按照映射配置文件中定义的映射规...

算法之名
55分钟前
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部