參考鏈接:http://mingxinglai.com/cn/2014/03/copy-file-in-linux/
本文介紹了linux之間傳輸文件的幾種方式,並通過具體實驗測試了幾種文件傳輸方式之間的傳輸速度。這篇文章是我一次作業的實驗報告,我經常查看這個文檔,所以貼出來方便自己查略。
###0. 實驗環境以及實驗數據
實驗環境: 兩台裝有Ubuntu的電腦,兩台電腦位於同一個局域網中,傳輸速度約4.1MB/s。
實驗數據: 使用MySQL的日志文件(ib_logfile0)進行測試,日志文件壓縮前1.1G,壓縮后159M,具體應用中,壓縮比例可能沒有這么高,但是不影響我們的討論。
###1. scp
scp是secure copy的縮寫,scp是linux系統下基於ssh登陸進行安全的遠程文件拷貝命令,主要用於linux服務器之間復制文件和目錄。scp使用ssh安全協議傳輸數據,具有和ssh一樣的驗證機制,從而可以實現安全的遠程拷貝文件。
下面介紹SCP三種不同用法的效率。注意:使用SCP前請配制好SSH。
1.1 scp 不使用壓縮
將本地文件拷貝到遠程服務器:
scp -P port ufile user@host:~/ufile
將遠程服務器中的文件拷貝到本地的用法:
scp -P port user@host:~/ufile ufile
經測試,SCP不啟用壓縮功能的情況下,傳輸ib_logfile0文件需要4:12s。
1.2 壓縮后傳輸
SCP傳輸ib_logfile0文件之所以需要那么多時間,是因為它沒有對傳輸的數據進行壓縮,可以先 將文件壓縮,然后再進行遠程拷貝。如下所示:
tar -zcf ufile.tar.gz ufile scp -P port ufile.tar.gz user@host:~/ufile.tar.gz ssh -p port user@host 'tar -zxf ufile.tar.gz'
經測試,先手動壓縮,然后再傳輸,4次測試結果的平均值為00:39s。
1.3 scp啟用壓縮
相對於第一種方法,第二種方法極大地減少了傳輸時間,但是需要執行三條語句,較為麻煩。更簡單的方法如下所示:
scp -P port -C ufile user@host:~/ufile
-C
選項啟用了SSH的壓縮功能,通過man ssh
可以看到,在-C選項的解釋部分有這么一句話:”the compression algorithm is the same used by gzip”。SSH與gzip使用的是同一種壓縮算法,即第二種方法與第三種方法幾乎一樣,但是,第三種方法更為簡單方便,所以,推薦使用第三種方法傳輸數據。
第三種方法傳輸ib_logfile0花費了00:52s,比第二種方法多花了10秒,這10秒主要用於數據的壓縮和解壓。
此外,值得注意的是,修改壓縮算法的壓縮比對總的數據傳輸時間影響不大,這是因為更高的壓縮比例,需要的壓縮時間也更多。
2. sftp
sftp是Secure File Transfer Protocol的縮寫,安全文件傳送協議,可以為傳輸文件提供一種安全的加密方法。sftp與ftp有着幾乎一樣的語法和功能,不過SFTP是SSH的一部分,它使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密、解密技術,所以傳輸效率比普通的FTP要低一些。
上傳數據到服務器上:
echo progress; echo "put ufile"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b
從服務器上下載數據:
echo progress; echo "get ufile"; echo quit) | sftp -o Compression=yes -o Port=port user@host -b
在我的實驗中,使用sftp傳輸ib_logfile0文件花費了1:05s。比SCP略慢。
參考鏈接:http://blog.csdn.net/stpeace/article/details/39404449
3. 直截使用ssh
將本地的數據傳輸到遠程服務器的用法:
gzip -c ufile | ssh -p port user@host 'gunzip >ufile'
將遠程服務器傳輸到本地的用法
ssh -p port user@host "gzip -c ufile" | gunzip -c > ufile
使用這種方式傳輸ib_logfile0需要00:55s,相對於scp -C
慢了幾秒,不過相差不大。但是,scp用法更簡單一些,只需要加一個-C
參數,而不用手動調用gzip壓縮程序。
4. nc
netcat(簡稱nc)是網絡工具中的瑞士軍刀,它能通過TCP和UDP在網絡中讀寫數據。通過與其他工具結合和重定向,你可以在腳本中以多種方式使用它。使用netcat命令所能完成的事情令人驚訝。
netcat所做的就是在兩台電腦之間建立鏈接並返回兩個數據流,在這之后所能做的事就看你的想像力了。你能建立一個服務器,傳輸文件,與朋友聊天,傳輸流媒體或者用它作為其它協議的獨立客戶端。我們這里只討論nc的用於數據傳輸的情況。
在服務器端:
sudo nc -l -p port | tar -zxf - #l 參數用於監聽 sudo nc -l -p port > ufile
在客戶端:
tar -zcf - ufile | sudo nc host port sudo nc host port < ufile
使用nc傳輸ib_logfile0文件需要00:49s,比SCP -C
略快,這是因為SCP需要對數據進行加密,而nc只是簡單的傳輸數據。
可以看到,nc不需要任何配置操作,使用也非常簡單,不過nc需要root權限。
5. rsync
rsync(remote sync)是類unix系統下的數據鏡像備份工具,從軟件的命名上就可以看出來,它主要用於數據的同步備份。
rsync有兩種用法,一種是通過SSH通道傳輸數據,另一種是通過與服務器的rsync守護者(daemon)進程建立連接來傳輸數據。下面對這兩種情況進行測試。
5.1 rsync with ssh
rsync使用SSH通道傳輸數據時,配置比較簡單,只要配置好了SSH,就直接可用,不需要額外的操作,正是這個原因,很多人更喜歡使用這種方式來使用rsync。
使用方法如下:
rsync -zav --rsh='ssh -p port' ufile user@host:path
rsync 使用SSH 通道傳輸ib_logfile0花費了00:55s,與直接使用SSH傳輸數據時間一樣。
5.1 rsync with daemon
不同於SCP和SFTP,rsync是一套獨立的軟件,除了通過SSH通道傳輸數據以外,還可以通過rsync的守護者進程進行數據傳輸。
這里只是對rsync的數據傳輸的性能進行簡單的測試,關於rsync的配置,可以參考其他資料。
rsync 的使用方法如下:
rsync -avz ufile user@host::module_name
在實驗中,rsync傳輸ib_logfile0共花費了00:51s,與scp -C
差不多。此外,值得注意的是,rsync使用zlib壓縮算法壓縮數據。ssh與gzip使用的是LZ77算法。
rsync的參數特別多,詳細的使用方法可以參考這里。
6. ftp
FTP命令使用文件傳輸協議(File Transfer Protocol, FTP)在本地主機和遠程主機之間或者在兩個遠程主機之間進行文件傳輸。
ftp的使用方法就不再介紹了,在我們的實驗中,使用FTP傳輸ib_logfile0共花費了4:25s,這是因為,FTP沒有數據壓縮的功能。從前面的實驗環境中可以看到,數據壓縮能夠顯著減少傳輸的數據量,數據不能壓縮,再好的傳輸工具也會受限於網絡傳輸速率。
7. 結論
單純從數據傳輸來看,我個人比較喜歡SCP,也強烈推薦SCP,不過,千萬要記住,使用SCP時一定要使用-C
選項,即啟用壓縮功能。從前面的實驗中也可以看到,啟用壓縮與不啟用壓縮傳輸的數據量相差很多。
此外,以上幾種數據傳輸方式也有各自的應用場景,其中,nc使用最簡單,配置也最方便,但是需要root權限,在有root權限沒有配置SSH的情況下,推薦使用nc。
rsync配置相對比較復雜,它的主要功能是進行增量備份而不是數據傳輸,在需要增量備份的情況下,毫不猶豫地選擇rsync。
FTP配置也比較麻煩,傳輸速度也很一般,而且,FTP沒有自帶壓縮功能,需要手動壓縮,但是,FTP是最常用的一種數據傳輸方式,大多數普通用戶都使用過FTP,對於用戶來說,學習成本較低,在需要將文件傳送給多個用戶時,推薦使用FTP。
SFTP是建立在SSH上的FTP,傳輸速度也很快,與SCP不分伯仲,但是SFTP可以交互式的使用,在某些情況下可能會比較有用,而且,如果已經配置好了SSH,SFTP的配置成本為零,即無需配置,直接可用。
總的來說,每種傳輸方式都各有千秋,我們應當根據自己的實際需要,選擇適合的文件傳輸方法。
sftp(Secure File Transfer Protocol):安全文件傳送協議。可以為傳輸文件提供一種安全的加密方法。sftp 與 ftp 有着幾乎一樣的語法和功能。SFTP為SSH的一部份,是一種傳輸文件到服務器的安全方式。在SSH軟件包中,已經包含了一個叫作SFTP(Secure File Transfer Protocol)的安全文件傳輸子系統,SFTP本身沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的連接操作,所以從某種意義上來說,SFTP並不像一個服務器程序,而更像是一個客戶端程序。
OpenSSH:是SSH(Secure SHell)協議的免費開源實現。SSH協議族可以用來進行遠程控制,或在計算機之間傳送文件。而實現此功能的傳統方式,如telnet(終端仿真協議)、 rcp ftp、 rlogin、rsh都是極為不安全的,並且會使用明文傳送密碼。OpenSSH提供了服務端后台程序和客戶端工具,用來加密遠程控件和文件傳輸過程的中的數據,並由此來代替原來的類似服務。 OpenSSH是使用SSH透過計算機網絡加密通訊的實現。它是取代由SSH Communications Security所提供的商用版本的開放源代碼方案。目前OpenSSH是OpenBSD的子計划。OpenSSH常常被誤認以為與OpenSSL有關聯,但實際上這兩個計划的有不同的目的,不同的發展團隊,名稱相近只是因為兩者有同樣的軟件發展目標──提供開放源代碼的加密通訊軟件。
SSH(Secure Shell):,由 IETF 的網絡工作小組(Network Working Group)所制定;SSH 為建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用 SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
- SSH是由客戶端和服務端的軟件組成的:服務端是一個守護進程(daemon),他在后台運行並響應來自客戶端的連接請求。服務端一般是sshd進程,提供了對遠程連接的處理,一般包括公共密鑰認證、密鑰交換、對稱密鑰加密和非安全連接; 客戶端包含ssh程序以及像scp(遠程拷貝)、slogin(遠程登陸)、sftp(安全文件傳輸)等其他的應用程序。
- 從客戶端來看,SSH提供兩種級別的安全驗證:第一種級別(基於口令的安全驗證); 第二種級別(基於密匙的安全驗證)。
- SSH 主要有三部分組成: 傳輸層協議 [SSH-TRANS] ;用戶認證協議 [SSH-USERAUTH] ;連接協議 [SSH-CONNECT]。