python向ftp上传文件,解决中文问题
# coding: UTF-8
import os
import sys
import salt.client
import salt.config
import time
from ftplib import FTP, FTP_TLS
import json
from subprocess import Popen, PIPE, STDOUT agent_ids = agent_ip.split(',')
if '{' in sys_type:
sys_types=json.loads(sys_type)
else:
sys_types={}
for i in agent_ids:
sys_types.update({i:sys_type}) def get_source_file_path(source_file_path,agent_id):
global sys_types
sys_type=sys_types.get(agent_id)
if sys_type == 'windows':
if source_file_path.startswith('/'):
source_file_path='c:'+source_file_path
source_file_path = source_file_path.replace('\\\\', '/')
source_file_path = source_file_path.replace('\\', '/')
source_file_path=source_file_path.decode('gbk')
print source_file_path
else:
if isinstance(source_file_path, unicode):
source_file_path = source_file_path.encode('utf8')
file_paths = source_file_path.split('\n')
return file_paths if isinstance(ftp_dir, unicode):
ftp_dir = ftp_dir.encode('utf8') BASE_URL = os.getenv('ANT_BASEURL') fail = []
success = [] def agent_to_proxy():
global agent_ids, source_file_path, success, fail, BASE_URL
proxy_path = os.getenv('ANT_MODULE_ROOT', '')
master_conf = os.path.join(proxy_path, 'conf', 'master')
if not os.path.exists(master_conf):
print('Proxy 路径不正确 {}'.format(proxy_path))
sys.exit(1)
opts = salt.config.client_config(master_conf)
LocalClient = salt.client.LocalClient(master_conf)
CACHE_DIR = opts['cachedir']
for agent_id in agent_ids:
file_paths=get_source_file_path(source_file_path, agent_id)
print file_paths
ret = LocalClient.cmd(agent_id, 'cp.push', file_paths, expr_form='list')
no_exist_hosts = set(ret.keys()) - set(agent_ids)
print no_exist_hosts
if no_exist_hosts:
print('异常:{} agent 不存在'.format(list(no_exist_hosts)))
sys.exit(1)
for file_path in file_paths:
for host, status in ret.iteritems():
if status is True:
proxy_file_path = os.path.join(CACHE_DIR, 'minions', host, 'files',
file_path.lstrip('/'))
res = proxy_to_ftp(proxy_file_path)
if res:
print file_path, '上传成功'
else:
fail.append('{}:{}'.format(host, file_path))
elif status is False:
print('{}:{} 上传失败,可能文件不存在'.format(host, file_path))
fail.append('{}:{}'.format(host, file_path))
else:
print('异常:{}:{} 上传失败,{}'.format(host, file_path, status))
fail.append('{}:{}'.format(host, file_path)) def _conn_ftp(user, passwd):
global ftp_host, ftp_port, connect_type
conn = False ispasv = False if user in (None, 'false') else True ftp_url = ftp_host
connect_type = connect_type.lower()
port = ftp_port
try:
if ':' in ftp_url:
conn = True
ftp_url, port = ftp_url.split(':') if conn:
ftp = FTP()
ftp.connect(host=str(ftp_url), port=int(port))
else:
ftp = FTP(ftp_url)
ftp.login(user, passwd) except Exception as e:
if 'requires SSL.' in '{}'.format(e):
try:
if conn:
ftp = FTP_TLS()
ftp.connect(host=ftp_url, port=int(port))
else:
ftp = FTP_TLS(ftp_url)
ftp.login(user, passwd)
except Exception as e:
print e
sys.exit(1)
else:
print e
sys.exit(1)
return ftp, ispasv def proxy_to_ftp(proxy_file_path):
global username, password, ftp_dir
ftp, ispasv = _conn_ftp(username, password)
ftp.encoding = "utf-8"
try:
ftp.set_pasv(ispasv)
# ftp.retrlines('LIST')
except:
ftp.set_pasv(not ispasv)
now_path = ftp.pwd()
print now_path if ftp_dir and ftp_dir != '/':
try:
ftp.cwd(ftp_dir)
except:
new_path = os.path.join(now_path, ftp_dir.lstrip('/'))
print new_path
ftp.mkd(new_path)
ftp.cwd(new_path) try:
ftp.rename(os.path.basename(proxy_file_path).decode("utf8").encode('gbk'), os.path.basename(proxy_file_path).decode("utf8").encode('gbk')+'.'+time.strftime('%Y-%m-%d_%H:%M:%S'))
except:
pass
print proxy_file_path
with open(proxy_file_path, 'rb') as f_:
result = ftp.storbinary('STOR %s' % os.path.basename(proxy_file_path).decode("utf8").encode('gbk'), f_) ftp.close()
if 'Transfer complete.' in result:
return True
else:
return False try:
agent_to_proxy()
if success:
print '文件传输成功:{}'.format(','.join(success))
if fail:
print '文件传输失败:{}'.format(','.join(fail))
sys.exit(1)
except Exception as e:
print e
sys.exit(1)
python向ftp上传文件,解决中文问题的更多相关文章
- 再看ftp上传文件
前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...
- Java ftp 上传文件和下载文件
今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...
- C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误
FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...
- .net FTP上传文件
FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...
- 通过cmd完成FTP上传文件操作
一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...
- FTP上传文件到服务器
一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...
- FTP上传文件提示550错误原因分析。
今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...
- FTP 上传文件
有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...
- Python基于Python实现批量上传文件或目录到不同的Linux服务器
基于Python实现批量上传文件或目录到不同的Linux服务器 by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...
随机推荐
- [详细实例]MicroPython拼插编程实战:DIY一台会思考的壁障车
(转载请注明文章来源,更多教程可自助参考www.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇) 在日常生活中,大家会经常见到各种各样的遥控车,它需 ...
- go笔记-熔断器
参考: https://studygolang.com/articles/13254 区别:(限速器 VS 熔断器) 限速器(limiter)可以限制接口自身被调的频率 熔断器可监控所调用的服务的失败 ...
- maven压缩js css
maven压缩<plugin> <!-- YUI Compressor Maven压缩插件 --> <groupId>net.alchim31.maven</ ...
- Scratch不仅适合小朋友,程序员和大学老师都应该广泛使用!!!
去年接触到了Scratch这个编程工具,它是一种简易图形化编程工具,这个软件的开发团队来自于麻省理工大学称为“终身幼儿园团队”(Lifelong Kindergarten Group). 网址http ...
- Git入门—创建项目
Git入门—创建项目 注:win10系统下 打开Git Bash,进入存放仓库的目录 创建 初始化git init,该命令执行完后会在当前目录生成一个 .git 目录. 所有 Git 需要的数据和资源 ...
- synchronized详解
关于synchronized,本文从使用方法,底层原理和锁的升级优化这几个方面来介绍. 1.synchronized的使用: synchronized可以保证在同一时刻,只有一个线程可以操作共享变量, ...
- npm ERR! code ENOENT
npm ERR! path F:\VsCodeWorkspace\labWeb\front\LabWebAdminFrontEnd\node_modules\core-jsnpm ERR! code ...
- HTTP/1.0 vs HTTP/1.1 vs HTTP/2
HTTP 1.0 vs 1.1 Proxy support and the Host field: HTTP 1.1 has a required Host header by spec. HTTP ...
- Ubuntu 16.04安装MySQL(5.7.18)
此篇为http://www.cnblogs.com/EasonJim/p/7139275.html的分支页. 安装MySQL前需要做如下了解: 1.MySQL各类型版本的区别,参考:http://ww ...
- stop()在animate中的用法
stop 是jQuery中用于控制页面动画效果的方法.运行之后立刻结束当前页面上的动画效果.stop在新版jQuery中添加了2个参数:第一个参数的意思是是否清空动画序列,也就是stop的是当前元素的 ...