# 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上传文件,解决中文问题的更多相关文章

  1. 再看ftp上传文件

    前言 去年在项目中用到ftp上传文件,用FtpWebRequest和FtpWebResponse封装一个帮助类,这个在网上能找到很多,前台使用Uploadify控件,然后在服务器上搭建Ftp服务器,在 ...

  2. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

  3. C# FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址。"的错误

    FTP上传文件时出现"应 PASV 命令的请求,服务器返回了一个与 FTP 连接地址不同的地址."的错误 解决方法是在原代码上增加这句话 reqFTP.UsePassive = f ...

  4. .net FTP上传文件

    FTP上传文件代码实现: private void UploadFileByWebClient() { WebClient webClient = new WebClient(); webClient ...

  5. 通过cmd完成FTP上传文件操作

    一直使用 FileZilla 这个工具进行相关的 FTP 操作,而在某一次版本升级之后,发现不太好用了,连接老是掉,再后来完全连接不上去. 改用了一段时间的 Web 版的 FTP 工具,后来那个页面也 ...

  6. FTP上传文件到服务器

    一.初始化上传控件. 1.我们这里用dropzone.js作为上传控件,下载地址http://www.dropzonejs.com/ 2.这里我们使用一个div元素作为dropzone载体. < ...

  7. FTP上传文件提示550错误原因分析。

    今天测试FTP上传文件功能,同样的代码从自己的Demo移到正式的代码中,不能实现功能,并报 Stream rs = ftp.GetRequestStream()提示远程服务器返回错误: (550) 文 ...

  8. FTP 上传文件

    有时候需要通过FTP同步数据文件,除了比较稳定的IDE之外,我们程序员还可以根据实际的业务需求来开发具体的工具,具体的开发过程就不细说了,这里了解一下通过C#实现FTP上传文件到指定的地址. /// ...

  9. Python基于Python实现批量上传文件或目录到不同的Linux服务器

    基于Python实现批量上传文件或目录到不同的Linux服务器   by:授客 QQ:1033553122 实现功能 1 测试环境 1 使用方法 1 1. 编辑配置文件conf/rootpath_fo ...

随机推荐

  1. 工具篇-Spark-Streaming获取kafka数据的两种方式(转载)

    转载自:https://blog.csdn.net/weixin_41615494/article/details/7952173 一.基于Receiver的方式 原理 Receiver从Kafka中 ...

  2. Codeforces Round #551 (Div. 2) EF Solution

    E. Serval and Snake 对于一个矩形,如果蛇的一条边与它相交,就意味着这条蛇从矩形内穿到矩形外,或者从矩形外穿到矩形内.所以如果某个矩形的答案为偶数,意味着蛇的头尾在矩形的同一侧(内或 ...

  3. CF618F Double Knapsack 构造、抽屉原理

    传送门 首先,选取子集的限制太宽了,子集似乎只能枚举,不是很好做.考虑加强限制条件:将"选取子集"的限制变为"选取子序列"的限制.在接下来的讨论中我们将会知道: ...

  4. Scrapy命令行详解

    官方文档:https://doc.scrapy.org/en/latest/ Global commands: startproject genspider settings runspider sh ...

  5. OpenStack-Glance(3)

    一. Glance功能 传统 IT 环境下,安装一个系统是要么从CD安装,要么用 Ghost 等克隆工具恢复.有如下几个问题: 如果要安装的系统多了效率就很低 时间长,工作量大 安装完还要进行手工配置 ...

  6. 打开Player时出现时间格式的错误提示

    安装完Player后如果更改了Windows的系统时间和日期显示格式,再次打开Player后会出现时间日期格式错误的提醒,需要按照要求更改Windows系统设置,才能正常运行Player. 此错误提示 ...

  7. SpringBoot返回date日期格式化,解决返回为TIMESTAMP时间戳格式或8小时时间差

    问题描述 在Spring Boot项目中,使用@RestController注解,返回的java对象中若含有date类型的属性,则默认输出为TIMESTAMP时间戳格式 ,如下所示: 解决方案    ...

  8. kafka相关问题集锦

    参考地址:https://blog.csdn.net/gao23191879/article/details/80815078?utm_source=blogxgwz5 你在写java 版的 kafk ...

  9. 返回通知 对方法返回的结果可以进行加工 例如请求接口后 返回的json参数可以加工成对象返回给调用者

  10. 学习Spring Boot:(十五)使用Lombok来优雅的编码

    前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现这一目的. 正文 添加依赖 在 pom.xml ...