FTP 是File Transfer Protocol(文件传输协议)的英文简称,它基于传输层协议TCP建立,用于Internet上文件的双向传输(上传和下载)。与大多数Internet服务一样,FTP也是一个客户端/服务器系统,要想完成文件传输需要FTP服务端和FTP客户端的配合。 FTP协议使用了两条TCP连接,一条是命令链路,用于在FTP客户端与服务器之间传递命令;另一条是数据链路,用来上传或下载数据。FTP服务器/客户端架构如图所示: FTP协议有两种工作方式:PORT主动方式和PASV被动方式。无论哪种工作方式,首先都需要客户端主动与远程主机上的FTP 服务器建立命令链路。 PORT方式的连接过程:客户端从一个任意的非特权端口M(M>1023,0到1023用于绑定特定的服务)向FTP服务器的命令端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链上发送FTP命令“port M+1”到FTP服务器。接着客户端开始监听端口M+1,服务器会从它自己的数据端口(默认是20)连接到客户端指定的数据端口(M+1),建立一条数据链路来传送数据。 在PASV方式中,命令连接和数据连接都由客户端发起,当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口( M > 1023和M +1)。第一个端口连接服务器的21端口建立一条命令链路,与PORT方式相同,但第二个端口建立数据链路的方式与PORT方式有所不同。当需要传送数据时,客户端提交PASV命令至服务器,这样做的结果是服务器会开启一个任意的非特权端口(N > 1023),并发送 PASV N命令给客户端。于是客户端发起从本地端口M+1到服务器的端口N的连接,建立一条数据链路用来传送数据。 由于使用FTP传送文件时必须先登录,在远程主机上获得相应的权限以后,才可上传和下载文件。除非有用户ID和口令,否则便无法传送文件。Internet上的FTP主机成千上万,不可能要求每个用户在每一台主机上都拥有账号,这违背了Internet的开放性。于是产生了匿名FTP来解决这个问题。 通过匿名FTP机制,用户无需注册账号就可以连接到远程主机上进行文件的上传和下载。系统管理员建立了一个特殊的用户ID,名为anonymous, Internet上的任何人在任何地方都可使用该用户ID。 Linux平台搭建FTP服务器 一般在各种Linux的发行版中,默认带有的FTP软件是vsftp。Vsftpd(Very Secure FTP Daemon)是一款运行在类Unix操作系统的FTP服务端程序。此处在Linux平台ubuntu发行版上使用vsftp搭建一个FTP服务器,可配合Python实现的客户端进行测试。 (1)使用#rpm -qa |grep vsftpd命令检查是否安装vsftpd软件,未安装则使用#sudo apt-get install vsftpd命令安装vsftpd软件 (2)使用#netstat -tnl命令检查端口服务是否打开,FTP服务器默认打开的是21端口。 (3)使用#service vsftpd start |stop|restart命令启动、停止、重启FTP。 (4)FTP的配置文件位于/etc/vsftpd/目录下,包括用户禁止登陆列表ftpusers和user_list、主配置文件vsftpd.conf。使用#sudo gedit /etc/vsftpd.conf命令修改配置文件vsftpd.conf,去除配置项前的#号以开启该项配置,修改配置文件后需要重启服务。
(5)使用#sudo userdel uftp命令删除用户,使用#sudo apt-get remove --purge vsftpd命令彻底删除该软件和相关文件 (6)匿名登陆目录的权限设置。默认情况下,匿名登入的根目录为/var/ftp(实际配置为/home/ftp),为了安全,这个目录默认不允许设置为777权限,否则ftp将无法匿名访问。当我们要匿名上传文件时,需要设置other用户的写权限。 sudo chmod o+w /home/ftp 更改ftp目录属主权限由默认的root权限为匿名的ftp权限,参数-R表示启动递归处理,修改某个目录下所有文件的权限,包括修改子目录中的文件权限。修改后ftp账户可以访问ftp文件夹。 sudo chown ftp /home/ftp -R sudo ls -l /home/ 总用量 12 drwxr-xr-x 2 ftp root 4096 2月 15 19:09 ftp drwxr-xr-x 2 uftp root 4096 2月 15 16:23 uftp drwxr-xr-x 40 yuanxiao yuanxiao 4096 2月 15 19:22 yuanxiao 也可以在嵌入式Linux平台LED发行版上使用vsftp搭建一个FTP服务器。 (1)将开发板连接至外网,通过opkg命令安装vsftp。 root@Yuanxiao:/etc/init.d# opkg update root@Yuanxiao:/etc/init.d# opkg install vsftpd (2)配置/etc/vsftpd.conf文件,配置选项含义和方式与上述ubuntu发行版上的vsftpd相同。如果通过匿名登陆需要设置/etc/vsftpd.conf文件对应选项。 (3)更改/etc/vsftpd.conf文件的权限。 在启动vsftpd 进程时会提示错误,表明配置文件不属于正确的用户。 root@Yuanxiao:~# /etc/init.d/vsftpd start 500 OOPS: config file not owned by correct user, or not a file 解决方法为设置/etc/vsftpd.conf文件的访问用户(当前为root用户) root@Yuanxiao:~# chown root /etc/vsftpd.conf root@Yuanxiao:~# ls -l /etc/vsftpd.conf -rwxrwxrwx 1 root root 840 Feb 15 13:48 /etc/vsftpd.conf (4)启动和停止vsftpd。 /etc/init.d/vsftpd start /etc/init.d/vsftpd stop 基于Python的客户端FTP 程序示例 # -*- coding: utf-8 -*- |
|
来自: 千锋Python学堂 > 《Python基础教程分享》