豪翔天下

Change My World by Program

0%

Python 连接FTP/FTPS

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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,但是参数比较多: `
    1
    2
    /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" 目标服务器
扩展
坚持原创技术分享,谢谢支持

欢迎关注我的其它发布渠道