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。
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 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服務器
大家在學的時候有什麼不清楚的地方,記得留言哈!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!