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]o:~# 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 27from ftplib import FTPftp = FTP() #建立FTP對象timeout = 30 port = 21ftp.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