Linux环境搭建FTP服务器与Python实现FTP客户端的互动介绍
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,去除配置项前的#号以开启该项配置,修改配置档案后需要重启服务。
与匿名登陆相关的配置如下:
anonymous_enable=YES # 控制是否允许匿名使用者登入,YES 为允许匿名登入,NO 为不允许。预设值为YES。
write_enable=YES # 是否允许登陆使用者有写许可权。属于全域性设定,预设值为YES。
no_anon_password=YES #若启动这项功能,使用匿名登入时,不会询问密码。预设值为NO。
ftp_username=ftp#定义匿名登入的使用者名称。预设值为ftp。
anon_root=/var/ftp
#使用匿名登入时,所登入的目录。预设值为/var/ftp。注意ftp目录不能是777的许可权属性。
anon_upload_enable=YES
#如果设为YES,则允许匿名登入者有上传档案(非目录)的许可权,只有在write_enable=YES时,此项才有效。前提是匿名使用者必须要有对上层目录的写入权。预设值为NO。
anon_world_readable_only=YES
#如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中开启阅读)。预设值为YES。
anon_mkdir_write_enable=YES
#如果设为YES,则允许匿名登入者有新增目录的许可权,只有在write_enable=YES时,此项才有效。前提是匿名使用者必须要有对上层目录的写入权。预设值为NO。
anon_other_write_enable=YES
#如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的许可权,譬如删除或者重新命名。(如果anon_upload_enable=NO,则匿名使用者不能
上传档案,但可以删除或者重新命名已经存在的档案;如果anon_mkdir_write_enable=NO,则匿名使用者不能上传或者新建资料夹,但可以删除或者重新命名已经存在的资料夹。)预设值为NO。
chown_uploads=YES #设定是否改变匿名使用者上传档案(非目录)的属主。预设值为NO。
chown_username=username #设定匿名使用者上传档案(非目录)的属主名。建议不要设定为root。
anon_umask=022
#设定匿名登入者新增或上传档案时的掩码值。预设值为077。如umask是022,这时建立一个许可权为666的档案,档案的实际许可权为666-022=644。
deny_email_enable=YES
#若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。若是使用匿名登入,则会要求输入email address,若输入的email address
在此档案内,则不允许进入。预设值为NO。
banned_email_file=/etc/vsftpd/banner_emails #此档案用来输入email
address,只有在deny_email_enable=YES时,才会使用到此档案。若是使用匿名登入,则会要求输入email
address,若输入的email address 在此档案内,则不允许进入。
其他主要配置如下所示:
listen= NO # 服务器监听,是否以独立执行的方式监听服务
local_enable=YES # 是否允许本地使用者访问
local_umask=022 # FTP上本地的档案许可权,预设是077
#dirmessage_enable=YES # 进入资料夹允许
xferlog_enable=YES # ftp 日志记录允许
onnect_from_port_20=YES # 启用20号埠作为资料传送的埠
xferlog_enable=yes # 启用上传和下传的日志
#xferlog_std_format=yes # 使用标准的日志格式
#ftpd_banner=XXXXX # 欢迎资讯
local_root=/var/www #使用本地登入时,所登入的目录。
pasv_enable=YES #
若设定为YES,则使用PASV工作模式;若设定为NO,则使用PORT模式。预设值为YES,即使用PASV工作模式。
pasv_min_port=30000 # 在PASV工作模式下,资料连线可以使用的埠范围的最大埠,0 表示任意埠。预设值为0。
pasv_max_port=30999 # 在PASV工作模式下,资料连线可以使用的埠范围的最小埠,0 表示任意埠。预设值为0。
(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。
[email protected]:/etc/init.d# opkg update
[email protected]:/etc/init.d# opkg install vsftpd
(2)配置/etc/vsftpd.conf档案,配置选项含义和方式与上述ubuntu发行版上的vsftpd相同。如果通过匿名登陆需要设定/etc/vsftpd.conf档案对应选项。
(3)更改/etc/vsftpd.conf档案的许可权。
在启动vsftpd 程序时会提示错误,表明配置档案不属于正确的使用者。
[email protected]:~# /etc/init.d/vsftpd start
500 OOPS: config file not owned by correct user, or not a file
解决方法为设定/etc/vsftpd.conf档案的访问使用者(当前为root使用者)
[email protected]:~# chown root /etc/vsftpd.conf
[email protected]:~# 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 27
from ftplib import FTP
ftp = FTP #建立FTP物件
timeout = 30
port = 21
ftp.connect(\'192.168.1.188\',port,timeout) # 连线FTP服务器
ftp.login(\'UserName\',\'888888\') # 使用账号登入
print ftp.getwelcome # 获得欢迎资讯
ftp.cwd(\'file/test\') # 设定FTP远端目录下当前路径
list = ftp.nlst # 获取目录下的档案列表
for name in list:
print name
#从FTP服务器下载档案
bufsize=1024#设定的缓冲区大小
filename="/usr/share/app/uboot.bin" #需要下载的档案及本地的存放位置
file_handle=open(filename,"wb").write #以写模式在本地开启档案
ftp.retrbinary("RETR uboot.bin",file_handle,bufsize) #下载服务器上的档案并写入本地档案
#删除远端档案
ftp.delete("art.bin") # 删除FTP服务器档案
#上传档案至FTP服务器
bufsize=1024#设定的缓冲区大小
filename="/usr/share/app/main.py" #需要上传的档案及本地的存放位置
file_handle=open(filename,"rb") #以读模式在本地开启档案
ftp.storbinary("STOR main.py",file_handle,bufsize) #将本地档案上传到FTP服务器
ftp.quit# 退出FTP服务器
大家在学的时候有什么不清楚的地方,记得留言哈!





























