Linux環境搭建FTP服務器與Python實現FTP客戶端的交互介紹python
FTP 是File Transfer Protocol(文件傳輸協議)的英文簡稱,它基於傳輸層協議TCP創建,用於Internet上文件的雙向傳輸(上傳和下載)。與大多數Internet服務同樣,FTP也是一個客戶端/服務器系統,要想完成文件傳輸須要FTP服務端和FTP客戶端的配合。ubuntu
FTP協議使用了兩條TCP鏈接,一條是命令鏈路,用於在FTP客戶端與服務器之間傳遞命令;另外一條是數據鏈路,用來上傳或下載數據。FTP服務器/客戶端架構如圖所示:安全
FTP協議有兩種工做方式:PORT主動方式和PASV被動方式。不管哪一種工做方式,首先都須要客戶端主動與遠程主機上的FTP 服務器創建命令鏈路。bash
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。app
Linux平臺搭建FTP服務器測試
通常在各類Linux的發行版中,默認帶有的FTP軟件是vsftp。Vsftpd(Very Secure FTP Daemon)是一款運行在類Unix操做系統的FTP服務端程序。此處在Linux平臺ubuntu發行版上使用vsftp搭建一個FTP服務器,可配合Python實現的客戶端進行測試。ui
(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服務器
複製代碼
你們在學的時候有什麼不清楚的地方,記得留言哈!