Java大法一統天下。遇到任何問題,先查一下Java中的解決方案。
地球上的許多事情,在Java中都能找到完美的解決方案。
FtpServer是apache MINA項目的一個子項目,它實現了一個ftp服務器,與vsftpd是同類產品.
Filezilla是一個可視化的ftp服務器.
Ftp客戶端也有很多,如Filezilla,FlashFXP,SmartFtp等,其中只有Filezilla是免費的.
之前搭建ftp服務器使用的是vsftpd,現在可以把它卸掉了,它以服務的形式運行,並且它包含很多我所不知道的東西。
使用步驟
- wget url下載壓縮包
- tar-zxvf解壓ftpserver
- 進入bin目錄,更改ftpd.sh,添加JAVA_HOME變量
- 輸入指令:./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也有一個對應的客戶端庫。