Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

程式設計師聯盟發表於2017-04-11

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

-- 作者 謝恩銘 轉載請註明出處

內容簡介


  1. 第四部分第三課:檔案傳輸,瀟灑同步
  2. 第四部分第四課預告:分析網路,隔離防火

檔案傳輸,瀟灑同步


上一課 Linux探索之旅 | 第四部分第二課:SSH連線,安全快捷 的內容應該來說比較“飽滿”。

這一課的內容相對簡單,所以我們慢慢“享用”。但是這一課要學的幾個命令卻是很有用的,特別是rsync。

經過上一課的學習,我們已經知道如何遠端連線到其他電腦了。從今以後,你就可以在自己的電腦上執行命令,來控制遠方的另一臺電腦了,很酷吧。

我們繼續探究Linux的奇幻網路世界。這個網路世界比較特別,也許你已經有所體會:
前輩們做了大量努力,靠加密方法來保證網路間傳輸的資料的安全,以防我們私人的資訊洩露,例如密碼。

這一課我們來學習檔案傳輸,主要分為以下幾方面:

  • 如何下載檔案

  • 如何連線到FTP,讀取、下載檔案

  • 如何安全地拷貝檔案

其中涉及的關於網路方面的知識,可以查閱小編已完結的系列教程《Web探索之旅

wget:下載檔案


我們就從一個簡單的命令開始吧,就是:wget

它可以使我們直接從終端控制檯下載檔案,只需要給出檔案的HTTP或FTP地址。

命令格式:

wget [引數] [URL地址]複製程式碼

例如:

wget http://cdimage.debian.org/debian-cd/8.6.0/i386/iso-cd/debian-8.6.0-i386-netinst.iso複製程式碼

就會開始從 cdimage.debian.org/debian-cd/8… 上下載 debian-8.6.0-i386-netinst.iso 這個檔案。

如果要停止下載,只需要按 Ctrl +C

可以看到下方會出現一個進度條,顯示下載進度:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

  • 38%表示已下載百分之38。
  • 117k/s是下載速度,表示117kb每秒。
  • eta是預計剩餘時間,此處是70秒。

那麼,怎麼事先獲得供wget下載的地址呢?

你可以用瀏覽器(比如firefox,chrome),找到要下載的檔案,然後在檔案上點選滑鼠右鍵,左鍵點選"複製連結地址",如下圖:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

然後黏貼到wget命令的地址引數中就可以了。

wget非常穩定,它在頻寬很窄的情況下和不穩定網路中有很強的適應性。
如果是由於網路的原因下載失敗,wget會不斷的嘗試,直到整個檔案下載完畢。
如果是伺服器打斷下載過程,它會再次聯到伺服器上從停止的地方繼續下載。
這對從那些限定了連結時間的伺服器上下載大檔案非常有用。簡直是bug般的存在。

繼續中斷的下載


要繼續一箇中斷的下載,只要在相同的下載命令中加入 -c 引數,例如:

wget -c http://cdimage.debian.org/debian-cd/8.6.0/i386/iso-cd/debian-8.6.0-i386-netinst.iso複製程式碼

c是英語continue的縮寫,表示“繼續”。

wget有非常多的引數選項,我們不能逐一列舉。可以參看wget的使用手冊:

man wget複製程式碼

wget的一個優點是會顯示下載的進度。稍後我們會學習的ftp命令則不會顯示下載進度。

scp:網間拷貝


我們以前的課程中學習過cp命令,它用於在自己的電腦上拷貝檔案。cp是英語copy的縮寫,表示"拷貝"。

scp是Secure CoPy的縮寫,表示“安全拷貝”。這個命令可以使我們通過網路,把檔案從一臺電腦拷貝到另一臺。當然,拷貝的資訊是安全的,正如它的名字所示。

也有一個命令rcp,是Remote CoPy的縮寫, 表示"遠端拷貝"。也可以做同樣的事,但是資訊沒有得到安全保護,不推薦。

scp使用起來有點類似上一課學過的SSH(Secure SHell)。這並不是巧合,因為scp是基於SSH的原理來運作的。SSH首先會在兩臺通過網路連線的電腦之間建立一條安全通訊的管道(如上一課所示),scp就利用這條管道安全地拷貝檔案。

scp的基本命令格式如下:

scp original_file destination_file複製程式碼

其中:

  • original_file表示原始檔,就是被拷貝的檔案。
  • destination_file表示目標檔案,就是拷貝產生的檔案。

這兩個檔案都可以如下方式來表示:

user@ip:file_name複製程式碼

其中user是登入名,ip是域名(例如google.fr)或ip地址(例如89.231.45.67),file_name是檔案路徑。不要忘了中間的@號和冒號(:)。

從自己電腦拷貝檔案到另一臺電腦


這很簡單,例如:

scp image.png oscar@89.231.45.67:/home/oscar/images/複製程式碼

表示把我的電腦中當前資料夾下的image.png檔案拷貝到遠端電腦(ip地址是89.231.45.67。當然了, 這是假想的ip地址)的使用者oscar的/home/oscar/images目錄下,檔名不變(還是image.png,你也可以改名字)。如下圖所示:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

當然了,scp會請求你輸入遠端電腦(ip地址是89.231.45.67)的使用者oscar的密碼。輸入密碼,回車,就開始拷貝了。

從另一臺電腦拷貝檔案到自己電腦


類似的用法,例如:

scp oscar@89.231.45.67:/home/oscar/images/image.png file_changed_name.png複製程式碼

表示從遠端電腦(ip地址是89.231.45.67)的使用者oscar的/home/oscar/images目錄下把image.png拷貝到我的電腦中當前資料夾下,並改名為file_changed_name.png(不改名也可以)。如下圖所示:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

修改埠


上述命令中,我們並沒有指定用哪個埠,只指定了ip地址。預設的埠號是22,和SSH一樣。我們也可以修改埠號,用-P引數。例如:

scp -P 7821 oscar@89.231.45.67:/home/oscar/images/image.png .複製程式碼

表示從遠端電腦(ip地址是89.231.45.67,埠7821)的使用者oscar的/home/oscar/images目錄下把image.png拷貝到我的電腦中當前資料夾下,名字不變。此處用點號(.)表示當前目錄。

注意:上一課中,SSH修改埠號使用-p引數,p是小寫。而scp修改埠號使用-P引數,P是大寫。

ftp&sftp:傳輸檔案


FTP是File Transfer Protocol的縮寫,表示《檔案傳輸協議》。顧名思義,就是用於傳輸檔案的。

FTP協議已經有些年紀了,1985年誕生,比小編還老呢。現在仍然是傳輸檔案的最常用協議。正所謂“廉頗老矣,尚能飯否”;人家是“FTP當道,寶刀未老”。

使用ftp主要分為兩種情況:

  • 從公共的FTP伺服器下載檔案。一般來說,當你點選瀏覽器上的下載連結時,瀏覽器就以自動和透明的方式來完成這個操作。這種情況下,連線是匿名的。

  • 從私有的FTP伺服器上傳或下載檔案。當我們從伺服器出租商處租用一臺伺服器作為個人網站之用時,出租商通常會給我們一個FTP的登入名和密碼,我們可以連線,以上傳及下載檔案。這種情況下,連線是需要身份驗證的。

因為並不是每個讀者都有自己私人的FTP伺服器,所以下面演示的時候,我們會連線到公共的FTP伺服器。當然,如果你想要連線到私人FTP伺服器,那方法是類似的。

我們這裡使用純命令列的形式來操作。當然了,也存在不少優秀的FTP軟體,可以提供圖形操作介面,例如著名的FileZilla。

連線到FTP伺服器


我們試著連線到Debian的FTP伺服器,地址如下:ftp://ftp.debian.org

方法很簡單:

ftp ftp.debian.org複製程式碼

Debian的FTP伺服器應該會有所迴應,並向你請求輸入使用者名稱和密碼。對於公共的FTP伺服器,使用者名稱一般都填寫 anonymous (表示“匿名”)。

密碼你隨便輸入什麼都會被接受。

登入成功後,會看到類似以下資訊:

230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>複製程式碼

現在你有了命令提示符了,就是那個

ftp>複製程式碼

你就可以輸入FTP命令了。

在FTP伺服器中操作


好訊息:你在FTP伺服器上可以使用的命令基本和我們到目前為止學習的Linux命令是一樣的。

例如:

  • ls:列出當前目錄的檔案
  • pwd:顯示當前目錄的路徑
  • cd:轉換目錄

你可以試試其他命令。

檔案傳輸


如果你想要上傳及下載檔案,需要知道兩個命令:

  • put:用於上傳檔案

  • get:用於下載檔案

如下圖所示:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

我們來下載一個檔案試試(README):

ftp> get README
local: README remote: README
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for README (940 bytes).
226 File send OK.
940 bytes received in 0.00 secs (918.9 kB/s)複製程式碼

下載完畢,README檔案現在位於你的當前目錄了。

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步
README檔案會位於你的家目錄(home)

近日發現(多謝讀者提示),Debian在他們的ftp.debian.org下加了一個目錄,叫debian,在這個目錄裡,才有原來那些檔案(例如README),而以前是沒有這個中間目錄debian的。
因此,要找到原來的README等等檔案,需要先cd到debian目錄中(cd debian),然後就可以用get README獲取到了。
見下面的截圖:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步
Debian在他們的ftp.debian.org下加了一個目錄,叫debian

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步
在這個debian目錄裡,才有原來那些檔案(例如README)

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步
在連線到debian的ftp伺服器之後,多加一步 cd debian

所以,要會見招拆招,就不怕別人“任性”了(此處指Debian)。


如果你連線到FTP伺服器,但又想要在自己的電腦上執行命令,怎麼辦呢?

只要在命令前加一個感嘆號就可以了,例如:

!pwd複製程式碼

就會在自己電腦上執行pwd命令,而不是在FTP伺服器上執行。

其他的ftp命令


還有好些其他的FTP命令,我們就不逐一列舉了。

用man ftp來看看其他可用的命令吧。你會發現,並不是所有的命令都與你到目前學過的Linux命令一樣的。例如,刪除檔案不是用rm命令,而是delete命令。

要從FTP伺服器斷開連線,你可以用Ctrl+D組合鍵。也可以用bye,exit或quit命令,效果是一樣的。

sftp:安全加密的ftp


ftp命令雖然方便,但是有一個致命缺點:不安全,資料不是加密傳輸的。任何人,只要連線到同一個網路,可以想辦法擷取到你傳輸的資料,或者你的密碼。

因此,我們需要請出sftp。sftp是Secure FTP的縮寫。表示“安全的FTP”。

sftp也是基於SSH的,所以登入需要使用者名稱和密碼,用法如下:

sftp user@ip複製程式碼

例如:

sftp oscar@coderunity.com複製程式碼

一旦你輸入使用者名稱和密碼,連線上之後,其他的操作和ftp是一樣的。只不過通訊被加密了,更安全。

用man sftp來看看其他可用的命令和引數吧。

上述命令中,我們並沒有指定用哪個埠,只指定了ip地址。預設的埠號是22,和SSH一樣。我們也可以修改埠號,用-oPort引數。例如:

sftp -oPort 3592 oscar@89.231.45.67複製程式碼

rsync:同步備份


rsync命令易於使用,功能很強大。

rsync是一個小程式,需要安裝,預設系統一般沒有這個命令。

sudo apt-get install rsync複製程式碼

rsync命令使我們可以同步兩個目錄,不管這兩個目錄位於同一臺電腦還是不同的電腦(用網路連線)。

rsync應該是最常用於“增量備份”的命令了吧。什麼是“增量備份”呢?

增量備份(incremental backup)是備份的一個型別,指在一次全備份或上一次增量備份後,以後每次的備份只需備份與前一次相比增加或者被修改的檔案。

備份有什麼好處呢?


想象一下,假如你不備份檔案。那麼一旦你的個人電腦遭遇不測,例如壞了、被偷,等等。那麼你的資料就找不回來了。
如果有寫了幾十頁的論文在裡面,那“哭倒長城”都有可能啊。
好些朋友就有過這樣慘痛的經歷。

小編以前就有備份的良好習慣,而且我備份不止會在一個地方。有的重要檔案,會備份到行動硬碟,電腦的本地其他硬碟,郵箱,等等。危機意識是很重要的。

所以備份很重要。假如你把你電腦上的檔案備份到遠端伺服器上,那麼如下圖所示:

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

用rsync來進行備份,是非常方便的。假如,你把自己的使用者家目錄都備份到伺服器上,也許有十幾個G的內容啊。

第一次備份時,需要傳輸這整整十幾個G的內容。但是以後呢,只需要傳輸新增或修改的內容就夠了,不需要再傳一遍。這就是rsync的強大之處,所謂“增量備份”的好處。

Linux 探索之旅 | 第四部分第三課:檔案傳輸,瀟灑同步

如上圖所示,我用rsync只傳輸了新的那個檔案。其他的並沒有再傳輸。

rsync就好像更智慧的scp命令。

備份到同一臺電腦的其他目錄


rsync -arv Images/ backups/複製程式碼

以上命令,將Images目錄下的所有檔案備份到backups目錄下。

-arv引數分別表示:

  • -a:保留檔案的所有資訊,包括許可權,修改日期,等等。

  • -r:遞迴呼叫。表示子目錄的所有檔案也都包括。

  • -v:冗餘模式。輸出詳細操作資訊。

刪除檔案


預設地,rsync在同步時並不會刪除目標目錄的檔案。例如,你的源目錄(被同步目錄)中刪除了一個檔案,但是用rsync同步時,它並不會刪除同步目錄中的相同檔案。

如果要使rsync也同步刪除操作。那麼可以這麼做:

rsync -arv --delete Images/ backups/複製程式碼

加上 --delete 引數就可以了。

備份到另一臺電腦的目錄


rsync -arv --delete Images/ oscar@89.231.45.67:backups/複製程式碼

是不是很簡單呢。

至於更多引數,可以用man rsync學習。

當然,rsync的強大之處絕不止於此。

你可以自己配置rsync,使得它從指定目錄(可以是多個目錄)備份到指定的ip地址的目錄下,而且可以指定哪些型別檔案是要備份的,哪些型別不要備份,然後把這一長串命令統一用Shell來寫成一個檔案(例如取名叫backup),使之可執行(用chmod命令),再把這個檔案的路徑新增到PATH中。

這樣你以後不論在哪個目錄下輸入backup,rsync就幫你自動同步該目錄了,非常帥氣。這酸爽,不言而喻~

至於怎麼做,就算是留給大家的課後興趣作業咯。

提示:可以自己百度或Google,例如“Ubuntu下rsync配置”。

總結


  1. wget命令可以下載檔案。

  2. 為了將檔案從一臺電腦拷貝到另一臺電腦,我們可以使用scp命令。它使用上一課提到的SSH,因此傳輸是加密的,是安全的。

  3. 我們可以用ftp命令來連線到一個FTP伺服器,然後就可以上傳及下載檔案了。

  4. sftp和ftp命令類似,但是它用了SSH,所以傳輸的資訊是加密的。

  5. rsync命令可以同步同一臺電腦或兩臺不同電腦上的兩個檔案(夾)的內容,用rsync命令來備份檔案特別方便。

第四部分第四課預告


今天的課就到這裡,一起加油吧!

下一課我們學習:Linux探索之旅 | 第四部分第四課:分析網路,隔離防火


微信公眾號「程式設計師聯盟」ProgrammerLeague
我是謝恩銘,在巴黎奮鬥的軟體工程師。
我的簡介
我的經歷
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:“向著標杆直跑”

相關文章