使用Apache FtpServer


Java大法一統天下。遇到任何問題,先查一下Java中的解決方案。
地球上的許多事情,在Java中都能找到完美的解決方案。
FtpServer是apache MINA項目的一個子項目,它實現了一個ftp服務器,與vsftpd是同類產品.
Filezilla是一個可視化的ftp服務器.

Ftp客戶端也有很多,如Filezilla,FlashFXP,SmartFtp等,其中只有Filezilla是免費的.
之前搭建ftp服務器使用的是vsftpd,現在可以把它卸掉了,它以服務的形式運行,並且它包含很多我所不知道的東西。

使用步驟

  1. wget url下載壓縮包
  2. tar-zxvf解壓ftpserver
  3. 進入bin目錄,更改ftpd.sh,添加JAVA_HOME變量
  4. 輸入指令:./ftpd.sh res/conf/ftpd-typical.xml & 其中‘&’表示后台運行.

在ftpd-typical.xml中可以更改密碼,這里的密碼是MD5加密了的。用一段Python代碼來實現:

import hashlib

md5 = hashlib.md5()
md5.update(bytes("xxxxxx", encoding='utf8'))
ans = md5.hexdigest()
print(ans)

運行之后,將所得MD5字符串粘貼到ftpd-typical.xml中即可。

一開始ftpd-typical.xml中只有兩個用戶,一個是admin,一個是anonymous。
可以更改ftpserver.user.admin.homedirectory屬性,自定義上傳文件的根目錄。
最好把ftpserver.user.anonymous.enableflag置為false,這樣比較安全。

使用FileZilla進行連接時,點擊“文件-站點管理器-新建”進行如下設置:

這里要注意

  • ftpd.sh中有一句cd $FTPD_HOME,這就使得這個程序的當前目錄變成了$FTPD_HOME.
    如果ftpd-typical.xml路徑不對,會一直報"文件未找到"異常.
  • ftpd.sh需要提供配置文件名稱作為參數,它的行為取決於ftpd.xml的配置,一般情況下,使用ftpd-typical已經足夠了.如果不知道ftpd.xml怎么配置,可以參考ftpd-full.xml,這個文件列出了所有的參數.
  • 默認情況下,用戶名和密碼都是admin,端口號為2121。
    ftp的默認端口號為21,http默認端口號為80,tomcat默認端口號為8080,django默認端口號8000。
    因為1024以內的端口號是不允許隨便占用的,而1024以后的卻可以.所以,要想占用1024以內的端口號,就要通過sudo命令.
  • 默認情況下,user.properties中的用戶密碼是md5加密的,要想不加密,需要更改ftpd-typical.xml.匿名用戶對於服務器上的文件是只讀的,這可以在user.properties中設置權限.

問題到這里並沒有結束,當退出shell之后,ftpd也就跟着停止運行了。
這個問題就是:在linux shell關閉后,程序如何才能繼續運行?

程序脫離shell后台運行

(1)方案一
CTRL+Z暫停程序,bg [作業號]將程序后台運行.這一步相當於使用[命令名]&運行程序.
對於后台運行的程序,它只是不占用shell了,但它仍然是shell的子程序,shell一死,它仍然要跪.所以需要使用命令
disown -h %1來把這個程序"不屬於"shell.

bg是把程序放到后台,fg是把程序調到前台.

用jobs命令查看當前作業.jobs -l查看作業列表.

當使用disown把程序解除之后,可以通過ps -e | grep bash 命令查看這個程序,可以kill之.

(2)方案二

SIGHUP是linux中信號的一種,表示hang up(掛起)信號.當shell收到SIGHUP信號時,shell的兒子們也會收到這個信號.

nohup ./haha.sh arg1 arg2 arg3 &

默認情況下,haha.sh運行過程中的一切輸出都寫入到了~/nohup.out文件中,注意要讓nohup在后台運行,所以加上"&".

然后ps -ex | grep haha,就可以看見這個程序了.

關閉當前shell,重新打開一個,仍舊ps -ex | grep haha,發現還在運行着.

(3)方案三:使用screen/tmux

方案二是最完美的解決方案,更改ftpd.sh,把其中最后運行Java的那句話用nohup重寫一遍,把錯誤信息輸出到控制台下,讓這個程序后台執行

eval "$JAVACMD" -classpath "$FTPD_CLASSPATH" "$MAIN_CLASS" "$CONFIG_FILE" 2>&1 "&"

(4)方案四:使用supervisor管理進程
(5)方案五:將ftpd設置成服務

測試和異常

如何測試一個ftp服務器是不是好使?方法一:打開瀏覽器輸入ftp://ip地址:端口號;方法二:使用filezilla.

如果filezilla報錯"收到服務器的 TLS 警告: Handshake failed (40)",文件>站點管理>新建站點,加密方式選擇:只是用普通ftp,這種方式不太安全.

今天使用Filezilla上傳文件總是失敗,一直顯示

錯誤:	20 秒后無活動,連接超時
錯誤:	文件傳輸失敗

用FlashFXP卻可以很正常上傳文件,但FlashFXP試用期只有30天,網上搜索注冊碼未果,遂想學學java實現ftp文件上傳,FtpServer也有一個對應的客戶端庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM