使用pyftpdlib搭建ftp服务器
ftp主动模式:控制平面建立后,数据平面是由服务器20端口反向连接客户端
ftp被动模式:控制平面建立后,数据平面由客户端连接服务器端指定的其他端口(需要防火墙开启服务器端额外的指定端口)
代码(来自官网):
1,服务器端 - 主动模式
from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer authorizer = DummyAuthorizer() authorizer.add_user("user", "12345", "/home/bridge", perm="elradfmwMT") authorizer.add_anonymous("/home/nobody") handler = FTPHandler handler.authorizer = authorizer # handler.passive_ports = range(10000, 10005) # 被动模式 server = FTPServer(('', 8888), handler) # 控制端口用8888,非默认21 server.serve_forever()
也可以一条命令解决:
python3 -m pyftpdlib -w -d [PATH] -u [USER] -P [PASSWORD]
centos需要开启相应端口(开放8888端口):
/sbin/iptables -I INPUT -p tcp --dport 8888 -j ACCEPT
2,客户端 - 主动模式
2.1,CMD
CMD登录:ftp user:12345@x.x.x.x 8888
登录完成后可以自由切换目录,但是执行put/get或者ls命令时,提示227 Entering passive mode
切换主动模式: ftp:> passive
但是切换后操作相关命令直接卡住
2.2,xftp
xftp连接时,选项中,把“使用被动模式”打勾去掉,可以顺利连接,显示/切换目录,上传/下载文件
但是上传文件时,只能传一个,第二个文件会一直在进行中
3,服务器 - 被动模式
代码中添加一句:
handler.passive_ports = range(10000, 10005) # 被动模式
即数据传输由客户端连接服务器端10000-10005的端口
防火墙开启相应端口
4,客户端 - 被动模式
4.1,CMD
一切正常
4.2,xftp
xftp连接时,选项中,把“使用被动模式”打上勾(默认有勾)
但是上传文件时,只能传第一个和第三个,其他文件都是正在进行中