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 ...
随机推荐
- PHP性能优化:in_array和isset 在大数组查询中耗时相差巨大,以及巧妙使用array_flip
今天在PHP业务开发中,发现了一个问题. 两个较大数组(20万+元素),遍历其中一个$a,另一个数组$b用于查找元素. 比如 foreach($a as $val){ if(in_array($xx, ...
- HNOI2019做题笔记
代码比较长所以直接去LOJ看吧- 鱼(计算几何.向量) 比较套路的内容:枚举\(D\),对于其他所有点按照\(D\)极角排序,按照极角序枚举\(A\),这样垂直于\(AD\)的线也会以极角序旋转,可以 ...
- Linux下安装 Python3
前言 Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2 ...
- 袁创:使用反射动态调用ActiveX控件
■■■■前言 目前的基于.NET平台的软件研发中仍然存在大量的对COM及ActiveX控件的调用.使用C#调用ActiveX控件时一般是使用vs.net工具自动生成的互操作性程序集.这种方法操作简单, ...
- Leetcode 27. Remove Element(too easy)
Given an array and a value, remove all instances of that value in-place and return the new length. D ...
- 转 - Linux安装python3.6
https://www.cnblogs.com/kimyeee/p/7250560.html
- 进程间通信(队列、管道)、消费者模型和进程池(apply,apply_async,map)
一.队列(先进先出) 进程间通信:IPC(Inter-Process Communication) 队列是使用管道和锁定实现,所以Queue是多进程安全的队列,使用Queue可以实现多进程之间的数据传 ...
- 一个很变态的SQL
select max(s.operat_time) as pzTime from ws_state_record s where s.status = (select p1.node_id from ...
- 鼠标事件-MouseEvent【转】
原文地址> 鼠标事件-MouseEvent 当鼠标进行某种操作时,就会生成一个event对象,该对象记录着鼠标触发事件时的所有属性. 可以通过如下方法在google控制台打印出 MouseEve ...
- 从零开始部署javaWeb项目到阿里云上面
[详情请看]http://www.cnblogs.com/softidea/p/5271746.html 补充几点特别需要注意的事情 一:putty相当于阿里云的控制台, WinSCP 相当于是专门上 ...