您好,登錄后才能下訂單哦!
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服務器
關于Linux環境如何搭建FTP服務器以及Python怎么實現FTP客戶端的交互問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。