如何使用 Python 连接 FTP 服务器
Posted on Wed, 25 Dec 2024 16:10:09 +0800 by LiangMingJian
前言
在 Python 中,可以通过 Python 标准库中的 ftplib 来实现对 FTP 服务器的操作。
连接与登录
from ftplib import FTP
# 实例化 FTP
ftp=FTP()
# 设置调试等级, 0 不调试, 1 只打印命令与响应, 2 打印详细信息
ftp.set_debuglevel(0)
# 设置 FTP 主动被动模式, False 主动模式, True 被动模式(默认的模式)
ftp.set_pasv(True)
# 设置编码格式
ftp.encoding = 'utf-8'
# 连接与登录
ftp.connect('******',21)
ftp.login('******','******')
# 打印欢迎信息
print(ftp.getwelcome())
# 退出客户端
ftp.quit()
列出目录信息
...
# 查看当前所在目录
print(ftp.pwd())
# 列出当前目录的文件与子目录
ftp.dir()
# 将结果保存到列表中
date1 = []
ftp.dir(date1.append)
print(date1)
# 仅获取文件或目录名称,并存放为列表
date2 = ftp.nlst()
print(date2)
...
目录切换与管理
...
# 切换目录
print(ftp.pwd())
ftp.cwd('CH1')
print(ftp.pwd())
# 新建目录
ftp.mkd('Test')
# 删除目录
ftp.rmd('Test')
...
上传文件
...
# 基本使用, 注意文件以二进制形式读取
# blocksize 每次传输的数据大小,默认 8192 = 8KB
file_name = 'requirements.txt'
with open('requirements.txt', 'rb') as f:
ftp.storbinary(f'STOR {file_name}', f, blocksize=1024)
# 显示上传进度
def progress(data):
global transferred
transferred += len(data)
print(f"已上传: {transferred} bytes")
transferred = 0
file_name = 'share.mp4'
with open('share.mp4', 'rb') as f:
ftp.storbinary(f'STOR {file_name}', f, blocksize=1024, callback=progress)
...
下载文件
...
# 基本使用, 注意文件以二进制形式读取
# blocksize 每次传输的数据大小,默认 8192 = 8KB
file_name = 'requirements.txt'
with open('requirements.txt', 'wb') as f:
ftp.retrbinary(f'RETR {file_name}', f.write, blocksize=1024)
# 显示下载进度
def progress(data, file):
global transferred
file.write(data)
transferred += len(data)
print(f"已下载: {transferred} bytes")
transferred = 0
file_name = 'share.mp4'
with open('share.mp4', 'wb') as f:
ftp.retrbinary(f'RETR {file_name}',
lambda date: progress(date, f),
blocksize=1024)
...
删除文件
...
# 指定当前目录下文件名
ftp.delete('share.mp4')
...
拓展阅读
FTP 的主动模式与被动模式
在主动模式中,服务器主动建立数据连接到客户端的随机端口。
此时,FTP 客户端会随机开启一个大于 1024 的端口 N 向服务器的 21 号端口发起连接,并发送 FTP 用户名和密码,随后开放 N+1 号端口进行监听,并向服务器发出 PORT N+1 命令,告诉服务端,客户端采用主动模式并开放了端口。
FTP 服务器在接收到 PORT 命令后,会用其本地的 FTP 数据端口(通常是20)来连接客户端指定的端口 N+1,进行数据传输。
在被动模式中,客户端主动建立数据连接到服务器的随机端口。
此时,FTP 客户端随机开启一个大于 1024 的端口 N 向服务器的 21 号端口发起连接,并发送用户名和密码进行登陆,同时开启 N+1 端口,向服务器发送 PASV 命令,通知服务器自己处于被动模式。
服务器收到命令后,会开放一个大于 1024 的端口 P(端口 P 的范围可以设置)进行监听,然后用 PORT P 命令通知客户端,自己的数据端口是 P。客户端收到命令后,会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。
一般情况下,用户可以在对应的 FTP 客户端软件中配置连接方式为主动还是被动,如 WinSCP,设置位于:编辑 > 高级 > 连接 > 被动模式。