代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Python
】
给shell调用的FTP命令
作者:
蓝宝石的傻话
/ 发布于
2013/10/11
/
1009
部分服务器由于有些数据需要定时通过FTP上传到备份服务器上保存,在每台服务器上安装FTP命令再编写bash脚本感觉不爽。写一个可调用的ftp命令来写shell脚本。暂时没有FTP下载功能。日后有需要再补上。
#!/usr/bin/env python #encoding=utf-8 import sys,ftplib,os.path def ftp_connect(ftphost,ftpost,ftpname,ftpwd): myftp=ftplib.FTP() try: myftp.connect(ftphost,ftpost,10) print 'FTP connect is success.' except Exception, e: print >> sys.stderr, "conncet failed - %s" % e return (0,'conncet failed') else: try: myftp.login(ftpname, ftpwd) print 'login success' except Exception, e: print >> sys.stderr, "login failed - %s" % e return (0,'login failed') else: print 'return 1' return (1,myftp) def l_r_diff(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata): mftmp=ftp_connect(ftphost,ftpost,ftpname,ftpwd) if mftmp[0]!=1: print mftmp[1] sys.exit() myftp=mftmp[1] rdata=splitpath(remotedata) myftp.cwd(rdata[0]) rsize=0L lsize=0L try: rsize=myftp.size(rdata[1]) except: pass if (rsize==None): rsize=0L if os.path.exists(localdata): lsize=os.stat(localdata).st_size else: print "%s doesn't exists" %localdata return print('LocalFile size: %d, RemoteFile size: %d' % (lsize,rsize)) return (myftp,lsize,rdata[1],rsize) def splitpath(remotepath): position=remotepath.rfind('/') return (remotepath[:position+1],remotepath[position+1:]) def ftp_up(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata): myftp,lsize,rdata,rsize=l_r_diff(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata) if (lsize==rsize): print 'remote filesize is equal with local' return if(lsize>rsize): localfile=open(localdata,'rb') localfile.seek(rsize) myftp.voidcmd('TYPE I') datasock='' esize='' try: datasock,esize=myftp.ntransfercmd("STOR "+rdata,rsize) except Exception, e: print >>sys.stderr, '----------ftp.ntransfercmd-------- : %s' % e return tmpsize=rsize while True: buf=localfile.read(1024*1024) if not len(buf): print '\rNo data break' break datasock.sendall(buf) tmpsize+=len(buf) print '\b'*30,'uploading %.2f%%'%(float(tmpsize)/lsize*100), if tmpsize==lsize: print '\rfile size equal break' break datasock.close() print 'close data handle' localfile.close() print 'close local file handle' myftp.voidcmd('NOOP') print 'keep alive cmd success' myftp.voidresp() print 'No loop cmd' myftp.quit() def ftp_download(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata): myftp,lsize,rdata,rsize=l_r_diff(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata) pass if __name__ == "__main__": from optparse import OptionParser parser = OptionParser() parser.add_option("-t","--type",dest="ftp_type",default='upload',help="Host of FTP") parser.add_option("-H","--host",dest="ftp_host",default="127.0.0.1",help="Host of FTP") parser.add_option("-P","--post",dest="ftp_post",default='21',help="Post of FTP") parser.add_option("-u","--username",dest="ftp_user",default='anonymous',help="anonymous") parser.add_option("-p","--password",dest="ftp_password",default=None,help="password") parser.add_option("-l","--localfile",dest="localfile",default=None,help="localfile") parser.add_option("-r","--remotefile",dest="remotefile",default=None,help="remotefile") (options,args) = parser.parse_args() def mftp(ftype,ftphost,ftpost,ftpname,ftpwd,remotedata,localdata): if ftype=='upload': ftp_up(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata) print "UPLOAD OK" elif ftype=='download': ftp_download(ftphost,ftpost,ftpname,ftpwd,remotedata,localdata) print "DOWNLOAD OK" else: print "FTP TYPE IS ERROR" mftp(options.ftp_type , options.ftp_host , options.ftp_post , options.ftp_user , options.ftp_password, options.remotefile , options.localfile) <strong>使用方法:</strong> #!/bin/bash #写配置 backuppath='' ftphost='' ftpusr='' ftpd='' #批量上传 ftpcmd='myftp.py' for j in $(ls $backuppath/*$(date +%Y%m%d)* ); do python $ftpcmd -t upload -H $ftphost -u $ftpusr -p $ftpd -l $j -r "/${j##*/}" done
试试其它关键字
同语言下
.
比较两个图片的相似度
.
过urllib2获取带有中文参数的url内容
.
不下载获取远程图片的宽度和高度及文件大小
.
通过qrcode库生成二维码
.
通过httplib发送GET和POST请求
.
Django下解决小文件下载
.
遍历windows的所有窗口并输出窗口标题
.
根据窗口标题调用窗口
.
python 抓取搜狗指定公众号
.
pandas读取指定列
可能有用的
.
比较两个图片的相似度
.
过urllib2获取带有中文参数的url内容
.
不下载获取远程图片的宽度和高度及文件大小
.
通过qrcode库生成二维码
.
通过httplib发送GET和POST请求
.
Django下解决小文件下载
.
遍历windows的所有窗口并输出窗口标题
.
根据窗口标题调用窗口
.
python 抓取搜狗指定公众号
.
pandas读取指定列
蓝宝石的傻话
贡献的其它代码
(
2
)
.
给shell调用的FTP命令
.
监控mysql启动情况并检测表错误修复
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3