实验环境
- Cygwin
- Python 2.7
- FileZella Server
原理
利用ftp协议进行文件传输时,主要利用两个端口:命令端口
(也叫作控制端口)和数据端口
。控制端口主要用来传输命令,数据端口主要用于传输数据。
这两个端口一般是20/21
,其中20
代表主动模式下的数据端口,21
代表控制端口。而被动模式下,我们将使用x/21
。其中x
代表我们被动模式下的数据端口,而21
仍然为控制端口(x
的获取我们将在后文说明)。
更详细的原理参见一篇讲得很好的博文。
实验过程
连接server
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(url, 21)
其中url为我们要连接的服务器的IP地址,这里是localhost
。
如果连接成功,我们将收到从服务器返回的响应码220
,返回具体信息如下:
220-FileZilla Server 0.9.60 beta
220-written by Tim Kosse (tim.kosse@filezilla-project.org)
220 Please visit https://filezilla-project.org/
登录
当我们成功连接server后,需要做的事情就是以用户的身份登录进我们的FTP服务器。
在我的FileZella Server上预设了一个用户,用户名为lz
,密码为123456
。接下来我们将以该身份登录进去。
首先,向服务器发送用户名
sock.sendall('USER lz\r\n')
cmd = self.sock_.recv(1024)
print cmd
cmd
是从服务器返回的状态信息,服务器将返回331告诉我们需要输入密码
331 Password required for lz
接下来向服务器发送密码
sock.sendall('PASS 123456\r\n')
cmd = sock.recv(1024)
print cmd
如果成功服务器将以230
响应,并且返回信息
230 Logged on