一、需求
有一個機器A,上面那有很多文件。現在新買一個機器B,不想用U盤復制,就想把A弄成個服務器,然后B登錄到A,想要什么文件就下載什么文件。
二、Win7實現
A是Win7和Ubuntu雙系統,首先在Win7上,用系統自帶的ftp服務器(傳送門),可以實現文件下載。通過建立虛擬目錄的方法,可以把不同盤里邊的文件鏈接到ftp服務器得根目錄,然后在B上輸入ftp://192.168.1.101:21(B機器的ip和默認ftp端口)就可以訪問A機器上的ftp服務器目錄,點擊文件就能下載,或者右擊使用迅雷下載也行。注意兩點,一個是防火牆,我是把防火牆關了B才能訪問到A機器。另一點是,除了本身指定的服務器目錄,新添加的虛擬目錄中的文件可能沒有權限下載。具體的安全配置有待深入。
三、Ubuntu 實現
今天把A進到Ubuntu下,B也進入Ubuntu,想在linux試一下ftp文件共享。首先在A機器上裝一個vsftpd
$ sudo apt-get install vsftpd
裝好了之后,查看是否打開21端口
$ sudo netstat -npltu | grep 21
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 15601/vsftpd
看home目錄下是否有一個ftp文件夾,沒有的話新建一個,然后修改配置文件
$ sudo vim /etc/vsftpd.conf
在最后加入一句
local_root=/home/ftp
設置服務器的根目錄
除了手動指定的這個目錄外,vsftpd還建立了 /srv/ftp 這個目錄。這個目錄是匿名用戶訪問的目錄。訪問手動指定的目錄是需要賬戶和密碼的。在機器A(裝有vsftpd服務器的機子)上,瀏覽器輸入本機地址:ftp://192.168.1.101,進入的頁面便是匿名用戶訪問的 /srv/ftp目錄。如果在A的終端中輸入
$ ftp localhost
會讓你輸入用戶名和密碼(系統的賬戶和密碼),進去之后,會發現是 /home/ftp 這個目錄。
【如果不能訪問,檢查一下配置文件里 local_enable=YES 和 anonymous_enable=YES 這兩句是否被注釋掉了。更多的關於vsftpd.conf參看ubuntu論壇 或者自己 man 5 vsftpd.conf】
配置好之后,在B機器的瀏覽器輸入A機器的地址ftp://192.168.1.101,進去的是機器B的 /srv/ftp 目錄,即匿名用戶訪問的目錄。這個目錄上的文件可以下載。但是,當我天真的把其他分區(比如Win7上的F盤)掛載到這個目錄下,這個目錄就打不開了。還是權限的問題,因為你是匿名訪問。下面我們使用終端登錄。
在B機器的終端中輸入
$ ftp 192.168.1.101
然后會讓你輸入賬戶和密碼。輸入A機器的賬戶和密碼之后,進到 /home/ftp 目錄下(如果賬戶名輸入anonymous,輸入密碼時直接回車,則仍進入匿名用戶訪問目錄)。回到機器A上,用以下命令把Win7上的分區E盤(這個盤已經掛載到Ubuntu的/media目錄下)“綁定掛載“到 /home/ftp目錄
$ sudo mount --bind /media/E /home/ftp
然后再在B機器上訪問A,就能在B機器上看到A機器的E盤上的文件。怎么獲取這些文件呢。有get和mget兩個命令可以使用。更多命令可以在ftp提示符下輸入help或者? 瀏覽,想查看某條命令的具體用法,輸入help + 命令或者 ?+命令,例如
ftp> help get
get receive file
mget命令可以一次獲取多個文件,在使用mget之前,用prompt off關閉提示,不然復制每一個文件之前會詢問你是否復制
prompt off
ftp> mget *.*
get下來的文件會在當前目錄下。
四、神器wget
雖然mget可以同時get多個文件,但是不能處理文件夾,要想遞歸的復制文件夾,就需要wget了。
$ wget -m --restrict-file-names=nocontrol ftp://192.168.1.101 --ftp-user=kitty --ftp-password=123456
解釋一下參數:
-m的意思是 表示鏡像指定的目錄 等同於 -r -N -l inf --no-remove-listing
--restrict-file-names解決中文亂碼問題
例子1:wget -r ftp://xxx/ccc/aa/bb/ -P /home/work -nH --cut-dirs=2
//加上 –cut-dirs=n 忽略n個目錄
//加上 -P dir 指定文件夾dir
例子2:傳送門
wget -r -p -np -k -P ~/tmp/ http://java-er.com
wget居然有如此邪惡的用法
這個語句表示下載全站資料
等於把一個網站整個靜態化到本地。
解釋一下參數
-P 表示下載到哪個目錄
-r 表示遞歸下載
-np 表示不下載旁站連接.
-k 表示將下載的網頁里的鏈接修改為本地鏈接.
-p 獲得所有顯示網頁所需的元素
額外的
-c 斷點續傳
-nd 遞歸下載時不創建一層一層的目錄,把所有的文件下載到當前目錄
-L 遞歸時不進入其它主機,如wget -c -r www.xxx.org/
-A 指定要下載的文件樣式列表,多個樣式用逗號分隔
-i 后面跟一個文件,文件內指明要下載的URL
不管用get還是wget,有的文件即使你copy到服務器目錄下,仍然沒有權限get它們。這時候需要改一下文件的所有者。
假如你以kitty賬戶登錄服務器A,想把A機器上的codes文件夾wget到B機器上。如果codes文件夾的所有者不是kitty,那你需要在A機器上將codes文件夾的所有者改為kitty。
$ sudo chown -R kitty codes/
參數 -R 的意思是遞歸地進行,即將codes文件夾下的子文件子目錄都改為kitty所有。然后就可以在機器B上get或 wget 啦。
使用wput上傳文件夾:
wput /home/test ftp://ftpusername:password@ip/test
五、Ubuntu自帶的“連接到服務器功能”
最后上個wget的圖:因為文件小而多,所以看起來速度只有幾百k,當wget幾個G的iso文件時速度可以到3MB+,跟USB2.0差不多