Python实现FTP服务器和客户端完整指南

在现代软件开发中,文件传输是一个常见的需求。FTP(File Transfer Protocol)作为经典的文件传输协议,虽然在安全性方面有所不足,但在内网环境或特定场景下仍然被广泛使用。本文将详细介绍如何使用Python实现一个功能完整的FTP服务器和客户端。

FTP协议简介

FTP是一种用于在网络上进行文件传输的标准网络协议。它使用客户端-服务器架构,通过TCP协议进行通信,默认使用21端口进行控制连接。

FTP服务器实现

依赖安装

首先需要安装pyftpdlib库,这是一个功能强大的Python FTP服务器库:

1
pip install pyftpdlib

服务器代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import os
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer

def main():
# 创建用户授权管理器
authorizer = DummyAuthorizer()

# 添加用户:用户名、密码、主目录、权限
authorizer.add_user('user', '12345', 'ftp_dirs', perm='elradfmwMT')

# 权限说明:
# 读取权限:
# - "e" = 切换目录 (CWD命令)
# - "l" = 列出文件 (LIST, NLST, STAT, MLSD, MLST, SIZE, MDTM命令)
# - "r" = 从服务器检索文件 (RETR命令)
# 写入权限:
# - "a" = 向现有文件追加数据 (APPE命令)
# - "d" = 删除文件或目录 (DELE, RMD命令)
# - "f" = 重命名文件或目录 (RNFR, RNTO命令)
# - "m" = 创建目录 (MKD命令)
# - "w" = 向服务器存储文件 (STOR, STOU命令)
# - "M" = 更改文件模式 (SITE CHMOD命令)
# - "T" = 更新文件最后修改时间 (MFMT命令)

# 可选:添加匿名用户
# authorizer.add_anonymous(os.getcwd())

# 创建FTP处理器
handler = FTPHandler
handler.authorizer = authorizer
handler.banner = "pyftpdlib based ftpd ready."

# 设置服务器地址和端口
address = ('0.0.0.0', 2121)
server = FTPServer(address, handler)

# 设置连接限制
server.max_cons = 256 # 最大连接数
server.max_cons_per_ip = 5 # 每个IP最大连接数

print(f"FTP服务器启动在 {address[0]}:{address[1]}")
print("等待客户端连接...")
server.serve_forever()

if __name__ == '__main__':
main()

服务器特性说明

  1. 用户管理:使用DummyAuthorizer进行简单的用户认证
  2. 权限控制:精细的文件操作权限控制
  3. 连接管理:支持多客户端并发连接
  4. 目录隔离:用户只能访问指定目录

FTP客户端实现

依赖安装

客户端使用fs库,它提供了统一的文件系统接口:

1
pip install fs

客户端代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
from fs.copy import copy_file
from fs.ftpfs import FTPFS
from fs.osfs import OSFS

def ftp_client_demo():
# 连接到FTP服务器
ftp_fs = FTPFS(
host='127.0.0.1',
user='user',
passwd='12345',
port=2121
)

try:
# 1. 列出根目录文件
print("=== 根目录文件列表 ===")
dirs = ftp_fs.listdir('.')
print(dirs)

# 2. 列出指定目录文件
print("\n=== /b目录文件列表 ===")
if ftp_fs.exists('/b'):
dirs = ftp_fs.listdir('/b')
print(dirs)

# 3. 读取文件内容
print("\n=== 读取文件内容 ===")
if ftp_fs.exists('/b/b.dat'):
with ftp_fs.open('/b/b.dat', 'r') as f:
content = f.read()
print(f"文件内容: {content}")

# 4. 检查文件是否存在
print(f"\n=== 检查文件存在性 ===")
exists = ftp_fs.exists('/b/d/dd.dat')
print(f"/b/d/dd.dat 存在: {exists}")

# 5. 下载文件
print("\n=== 下载文件 ===")
current_directory_fs = OSFS('.')
if ftp_fs.exists('/b/b.dat'):
copy_file(ftp_fs, '/b/b.dat', current_directory_fs, 'downloaded_b.dat')
print("文件下载完成: downloaded_b.dat")

# 6. 上传文件
print("\n=== 上传文件 ===")
if current_directory_fs.exists('downloaded_b.dat'):
copy_file(current_directory_fs, 'downloaded_b.dat', ftp_fs, 'uploaded_file.dat')
print("文件上传完成: uploaded_file.dat")

# 7. 删除文件
print("\n=== 删除文件 ===")
if ftp_fs.exists('uploaded_file.dat'):
ftp_fs.remove('uploaded_file.dat')
print("文件删除完成: uploaded_file.dat")

# 8. 遍历目录结构
print("\n=== 遍历目录结构 ===")
for root, dirs, files in ftp_fs.walk('/'):
print(f"目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print("-" * 30)

# 9. 创建目录
print("\n=== 创建目录 ===")
new_dir = '/test_directory'
if not ftp_fs.exists(new_dir):
ftp_fs.makedirs(new_dir)
print(f"目录创建完成: {new_dir}")

except Exception as e:
print(f"操作失败: {e}")
finally:
# 关闭连接
ftp_fs.close()
print("\n连接已关闭")

if __name__ == '__main__':
ftp_client_demo()

主要功能特性

服务器端功能

  1. 多用户支持:可以配置多个用户账户
  2. 权限管理:细粒度的文件操作权限控制
  3. 连接限制:防止恶意连接消耗服务器资源
  4. 目录隔离:用户只能访问授权目录

客户端功能

  1. 目录操作:列出、创建、删除目录
  2. 文件操作:上传、下载、删除文件
  3. 文件检查:检查文件/目录是否存在
  4. 内容读取:直接读取远程文件内容
  5. 递归遍历:遍历整个目录树结构

使用场景

  1. 内网文件共享:在局域网内快速共享文件
  2. 自动化部署:程序自动上传/下载配置文件
  3. 数据备份:定期备份重要文件到FTP服务器
  4. 开发测试:在开发环境中模拟文件传输场景

安全考虑

  1. 密码安全:避免使用弱密码,考虑使用更强的认证机制
  2. 网络安全:FTP传输明文,敏感环境建议使用SFTP或FTPS
  3. 权限控制:根据实际需求严格控制用户权限
  4. 防火墙配置:适当配置防火墙规则限制访问

扩展功能

日志记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import logging

# 配置日志
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('ftp_server.log'),
logging.StreamHandler()
]
)

# 在handler中添加日志记录
handler.authorizer = authorizer
handler.banner = "pyftpdlib based ftpd ready."

SSL支持

1
2
3
4
5
6
from pyftpdlib.handlers import TLS_FTPHandler

# 使用TLS加密
handler = TLS_FTPHandler
handler.certfile = "server.crt"
handler.keyfile = "server.key"

总结

本文介绍了使用Python实现FTP服务器和客户端的完整方案。通过pyftpdlibfs库,我们可以快速构建功能强大的文件传输系统。在实际应用中,需要根据具体需求调整配置参数,并充分考虑安全性问题。

这个实现方案具有良好的扩展性,可以根据需要添加更多功能,如用户管理界面、文件版本控制、传输进度显示等。对于需要高安全性的场景,建议使用SFTP或其他加密传输协议。