Home / Blog / 编程语言
Tech · 编程语言 · Python

Python 连接FTP/FTPS

H by Haofly
· 2020-11-07 · updated 2022-04-26 · 240 views

python自带库ftplib对ftp的连接提供了支持。下面是其基本的语法

ftp = ftplib.FTP(timeout=300)	# 连接基本的FTP
ftp = ftplib.FTP_TLS(timeout=300)	# 连接FTPS

ftp.connect(host, port)	# 连接目标服务器
ftp.login(username, password)	# 登陆目标服务器
ftp.mkd('/abc')	# 创建远程目录
ftp.dir()	# 显示当前目录下的文件及目录,会直接打印到标准输出
ftp.nlst()	# 返回当前目录下的文件及目录
ftp.cwd('')	# 切换目录
ftp.pwd()	# 返回当前所在目录
ftp.rmd(dirname)	# 删除远程目录
ftp.delete(filename)	# 删除远程文件
ftp.rename(fromname, toname)	# 给远程文件重命名
ftp.close()	# 关闭连接
ftp.voidcmd('NOOP')	# 判断连接是否存活

## 上传文件
local_file_handler = open('test.txt', 'rb')
ftp.storbinary("STOR " + os.path.join(remote_path, filename), local_file_handler)
    
## 下载文件
local_file_handler = open('test.txt', 'rb')
ftp.retrbinary("RETR " + os.path.join(remote_path, filename), file_handler.write)
local_file_handler.seek(0)

Troubleshooting

  • ftplib出现ssl.SSLError: [SSL] internal error (_ssl.c:1123): 我的情况是服务器的ssl版本太高了(ubuntu20.04),并且目标FTPS服务器的ssl版本太低了,看论坛好像确实是有这么一个bug,在python方面没有找到解决方案,最终找到几个命令行工具来完成需求: 上传使用的是ftp-uploader,直接用apt命令安装的;下载则是用的lftp,但是参数比较多: `

    /usr/bin/lftp -c 'set ftp:ssl-allow true ; set ssl:priority NORMAL:+VERS-TLS1.1:+VERS-TLS1.2; 
    set ssl:verify-certificate no; open -u 用户名,密码 -e "cd 目录; mget 文件名; quit" 目标服务器
扩展
Haofly · 豪翔天下 · 2020-11-07

评论 · Comments

评论由 Giscus 提供,需用 GitHub 账号登录;留言会同步到这个仓库的 Discussions 里。