ftp 命令使用文件傳輸協議(File Transfer Protocol, FTP)在本地主機和遠程主機之間或者在兩個遠程主機之間進行文件傳輸。
FTP 協議允許數據在不同文件系統的主機之間傳輸。儘管這個協議在傳輸數據上提供了高適應性,但是它並沒有嘗試去保留一個特定文件系統上的文件屬性(例如一個文件的保護模式或者修改次數)。而且 FTP 協議很少對一個文件系統的整體結構作假定,也不提供這樣的功能,比如遞歸的拷貝子目錄。在使用 ftp 命令時,需要注意 FTP 協議的這些特性。當需要保留文件屬性或者需要遞歸的拷貝子目錄時,可以使用 rcp/scp 等命令。
ftp 命令的一般格式如下:
$ ftp 主機名 /IP
其中“主機名 /IP ”是所要連接的遠程機的主機名或 IP 地址。在命令行中,主機名屬於可選項,如果指定主機名,ftp 將試圖與遠程機的 ftp 服務程序進行連接;如果沒有指定主機名,ftp 將給出提示符,等待用戶輸入命令:
$ ftp ftp > |
此時在 ftp> 提示符後面輸入 open 子命令加主機名或 IP 地址,將試圖連接指定的主機。不管使用哪一種方法,如果連接成功,需要在遠程機上登錄。用戶如果在遠程機上有帳號,就可以通過 ftp 使用這一帳號並需要提供口令。在遠程機上的用戶帳號的讀寫權限決定該用戶在遠程機上能下載什麼文件和能將上載文件放到哪個目錄中。在遠程站點上登錄成功後,在“ ftp> ”提示符下可以自由使用 ftp 提供的各種子命令,最常用的子命令如下表所示。
表 1. ftp 子命令
命令 | 描述 |
ls | 列出遠程機的當前目錄 |
cd | 在遠程機上改變工作目錄 |
lcd | 在本地機上改變工作目錄 |
ascii | 設置文件傳輸方式爲 ASCII 模式 |
binary | 設置文件傳輸方式爲二進制模式 |
close | 終止當前的 ftp 會話 |
get (mget) | 從遠程機傳送指定文件到本地機 |
put (mput) | 從本地機傳送指定文件到遠程機 |
open | 連接遠程 ftp 站點 |
quit | 斷開與遠程機的連接並退出 ftp |
? | 顯示本地幫助信息 |
! | 轉到 Shell 中 |
prompt 1 | 關閉交互模式 |
利用編寫 ftp 腳本可以自動完成文件傳輸任務。具體方法是使用 ftp 命令的 -in 選項,並重定向 ftp 命令的輸入。現在我們來編寫一個利用 ftp 登錄到遠程服務器,並以 bin 的文件格式,在 /home 目錄下,下載 file1.log 以及 file2.sh 至本機 /opt/ibm/,並從本地 /opt 目錄上傳文件 file3.jave 至遠程服務器 /home 的自動化腳本。
ftp -ni <<+ open $IP user $USERNAME $PASSWD bin cd /home lcd /opt/ibm mget file1.log file2.sh lcd /opt mput file3.jave ls bye |
rcp 意爲“ remote file copy ”(遠程文件拷貝)。該命令用於計算機之間進行文件拷貝。其有兩種格式。第一種格式用於文件到文件的拷貝;第二種格式用於把文件或目錄拷貝到另一個目錄中。
rcp [-px] [-k realm] file1 file2 rcp [-px] [-r] [-k realm] file directory |
每個文件或目錄參數既可以是遠程文件名也可以是本地文件名。遠程文件名具有如下形式:rname@rhost:path,其中 rname 爲遠程用戶名,rhost 爲遠程計算機名,path 爲該文件的路徑。下表說明了 rcp 命令各個參數的含義。
表 2. rcp 命令的命令行參數
選項 | 描述 |
-r | 遞歸地將源目錄中的所有內容拷貝到目的目錄中。若使用該選項,目的須爲一個目錄。 |
-p | 試圖保留源文件的修改時間和模式,忽略 umask 。 |
-k | 請求 rcp 獲得在指定區域內的遠程主機的 Kerberos 許可,而不是獲得由 krb_relmofhost(3)確定的遠程主機區域內的遠程主機的 Kerberos 許可。 |
-x | 爲傳送的所有數據進行 DES 加密。這會影響響應時間和 CPU 利用率,但是可以提高安全性。 |
如果在文件名中指定的路徑不是完整的路徑名,則該路徑將被解釋爲相對遠程機上同名用戶的主目錄。若沒有給出遠程用戶名,則使用當前用戶名。如果遠程機上的路徑包含特殊 shell 字符,需要使用反斜線()、雙引號(”)或單引號(’)將其括起來,使所有的 shell 元字符都能被遠程地解釋。需要說明的是,rcp 不提示輸入口令,它通過 rsh(remote shell)命令來執行拷貝。
- 將本地文件複製到遠程登錄目錄中
rcp <source> <remoteDir>
- 將多個本地文件複製到遠程登錄目錄的子目錄中
rcp <source1> <source2> <source3> <subdirectory in remote system>
- 將多個文件從多個遠程源複製到使用不同用戶名的遠程目標中
rcp <host1.user1:source1> <host2.user2:source2> <dest.destuser:directory>
scp 命令在網絡上的主機之間拷貝文件,它是安全拷貝(secure copy)的縮寫。 scp 命令使用 ssh 來傳輸數據,並使用與 ssh 相同的認證模式,提供同樣的安全保障。 scp 命令的用法和 rcp 命令非常類似,這裏就不做過多介紹了。一般推薦使用 scp 命令,因爲它比 rcp 更安全。
我們可以通過配置 ssh,使得在兩臺機器間拷貝文件時不需要每次都輸入用戶名和密碼。
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:]file1 [...] [[user@]host2:]file2 |
使用 scp 命令,需要輸入密碼,如果不想每次都輸入,可參考下面的方法。
首先生成密鑰對
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_rsa. Your public key has been saved in /home/user/.ssh/id_rsa.pub. The key fingerprint is: 10:66:da:38:85:8a:8c:bd:db:9c:6e:eb:ee:bd:7d:15 user@somehost |
在這裏,我們指定了生成 rsa 類型的密鑰。在提示密鑰的保存路徑和密碼時,可以直接回車使用默認路徑和空密碼。這樣,生成的公共密鑰保存在 $HOME/.ssh/id_rsa.pub,私有密鑰保存在 $HOME/.ssh/id_rsa 。然後把這個密鑰對中的公共密鑰的內容複製到要訪問的機器上的 $HOME/.ssh/authorized_keys 文件中。這樣,下次再訪問那臺機器時,就不用輸入密碼了。
- Copy 本地文件 /etc/eva.log, 到遠程機器 sysB, 用戶 user 的家目錄下
scp /etc/eva.log user@sysB:/home/user
- copy 遠程機器 sysB 上的文件 /home/uesr/eva.log, 到本地的 /etc 目錄下 , 並保持文件屬性不變
scp -p user@sysB:/home/uesr/eva.log /etc
- copy sysB 上的目錄 /home/user, 到本地 /home/user/tmp, <new dir,/home/user/tmp/user>
scp -r user@sysB:/home/user /home/user/tmp
wget 是一個經由 GPL 許可的可從網絡上自動獲取文件的自由軟件包。它是一個非交互式的命令行工具。支持 HTTP,HTTPS 和 FTP 協議,支持代理服務器以及斷點續傳功能。 wget 可實現遞歸下載,即可跟蹤 HTML 頁面上的鏈接依次下載來創建遠程服務器的本地版本,完全重建原始站點的目錄結構,實現遠程網站的鏡像。在遞歸下載時,wget 將頁面中的超級鏈接轉換成指向本地文件,方便離線瀏覽。由於非交互特性,wget 支持後臺運行,用戶在退出系統後,仍可繼續運行。功能強大,設置方便簡單。
wget [options] [URL-list] |
wget 有很多不同的參數以用於遠程站點信息的獲取,常用參數如下,更多參數請參照 wget 幫助手冊 http://www.gnu.org/software/wget/manual/wget.html
表 3. wget 工具常用參數
選項 | 描述 |
-r | 遞歸下載服務器上所有的目錄和文件。由 -l 選項來指定遞歸深度。 |
-b | 後臺下載 |
-m | 製作站點鏡像 |
-c | 指定斷點續傳功能。該功能要求服務器支持斷點續傳。 |
-I | 指定下載目錄列表,可實現批量下載 |
-A/-R | 指定接受/拒絕下載列表,實現選擇性地下載 |
--proxy=on/off | 指定是否利用代理服務器進行下載 |
-t, --tries=NUMBER | 最大嘗試鏈接次數 (0 表示無限制,默認爲 20 次 ) |
-nc, --no-clobber | 不覆蓋已存在的文件 |
-N, --timestamping | 只下載比本地新的文件 |
-nd --no-directories | 不進行目錄結構創建 |
-x, --force-directories | 強制創建目錄結構 |
-nH, --no-host-directories | 不繼承主機目錄結構 |
-P, --directory-prefix=PREFIX | 設置目錄前綴 |
- 遞歸下載 http://www.ibm.com.cn 站點的信息。下載所有顯示完整網頁所以需要的文件,如圖片等。在下載不進行上層目錄搜索並將絕對鏈接轉換爲相對鏈接。
wget -r -p -np -k http://www.ibm.com.cn
- 將在本地硬盤建立 http://www.ibm.com.cn 的鏡像,鏡像文件存入當前目錄下一個名爲 www.ibm.com.cn 的子目錄中(也可以使用 -nH 參數指定不建立該子目錄,而直接在當前目錄下建立鏡像的目錄結構),遞歸深度爲 4,重試次數爲無窮(若連接出現問題,wget 將永遠重試下去,直至任務完成)
wget -m -l4 -t0 http://www.ibm.com.c
- 使用代理進行下載,並實現斷點續傳。代理可以在環境變量 PROXY 或 wgetrc 文件中設定。 -c 選項要求服務支持斷點續傳。
wget -Y on -c http://www.ibm.com.cn
另一個可以用來進行文件傳輸的工具是 curl,它是對 libcurl 庫的一個命令行工具包裝。 libcurl 庫中提供了相應功能的 API,可以在程序中調用。對於 libcurl 庫的使用方法介紹超出了本文的討論範圍。 curl 使用 URL 的語法來傳輸文件,它支持 FTP, FTPS, HTTP, HTTPS, TFTP, SFTP, TELNET 等多種協議。 curl 功能強大,它提供了包括代理支持,用戶認證,FTP 上載,HTTP post,SSL 連接,文件續傳等許多特性。
curl [options … ] <url> |
其中下載參數大約有 80 多個,curl 的各個功能完全依靠這些參數來完成。下面舉例說明 curl 的一些基本用法。
- 獲取 GNU 的主頁
curl http://www.gnu.org
- 獲取 GNU 的 FTP 服務器上根目錄下的 README 文件
curl ftp://ftp.gnu.org/README
- 從一個字典中獲取 curl 的定義
curl dict://dict.org/m:curl
- 如果需要指定用戶名和密碼的話,可以在 url 中指定,或者使用 -u 參數
curl ftp://name:[email protected]:port/full/path/to/file
curl -u name:passwd ftp://machine.domain:port/full/path/to/file
- curl 會將從指定 url 處獲取的內容打印到標準輸出上。如果需要保存在本地文件中,可以使用 -o,或使用 -O 參數指定使用遠程主機上的文件名(如果 url 中沒有給出文件名的部分,則此操作將會失敗)
curl – o gnu.html http://www.gnu.org
curl – O http://www.gnu.org/index.html
- 使用 -x 選項來使用代理進行連接
curl -x my-proxy:port ftp://ftp.somesite.com/README
- 通過使用 curl 的 -T 選項來進行上載
curl -T - ftp://ftp.upload.com/upfile
- 此命令從標準輸入讀取數據,並上載至遠程 FTP 服務器上的 upfile 文件中。也可以指定上載一個本地文件
curl -T localfile -a ftp://ftp.upload.com/upfile
其中 -a 參數表示以添加方式將 localfile 中的內容附加到 upfile 的末尾。
總的來說,curl 適合用來進行自動的文件傳輸或操作序列,它是一個很好的模擬用戶在網頁瀏覽器上的行爲的工具。尤其當需要在程序中調用時,libcurl 是個很好的選擇。
rsync 是一款高效的遠程數據備份和鏡象工具,可快速地同步多臺主機間的文件,其具有如下特性:
- 支持鏈接、所有者、組信息以及權限信息的拷貝;
- 通過遠程 shell(ssh, rsh)進行傳輸;
- 無須特殊權限即可安裝使用;
- 流水線式文件傳輸模式,文件傳輸效率高;
- 支持匿名操作;
需要提及的是 rsync 以其優越的性能優勢區別於其它幾種 Linux 文件傳輸方法,其同步文件的速度相當快,這主要歸功於 rsync 所使用的傳輸算法。簡而言之 rsync 算法能在相當短的時間內計算出需要備份的數據,只對源文件與目標文件的不同之處進行傳輸,從而降低網絡中傳輸的數據量,以此達到快速備份鏡像的目的。下面通過一典型應用場景來描述 rsync 算法的基本原理:主機 A 與主機 B 均有對同一文件的拷貝,用戶對主機 A 上的拷貝進行更新,主機 B 通過 rsync 算法對更新後的文件進行同步。以下是該算法的實現步驟:
- 主機 B 將原始拷貝劃分成大小爲 N 的不重合的若干塊(文件末尾部分分塊大小可能不足 N),並對這些數據塊進行兩種不同方式的校驗:32 位的滾動弱校驗、128 位的 MD4 強校驗。弱校驗較之強校驗計算速度快。
- 主機 B 將每個數據塊的弱校驗、強校驗結果發送給主機 A 。
- 主機 A 對更新後的文件拷貝中的每個長度爲 N 的數據塊進行弱校驗並與從 B 接收到的弱校驗值進行匹配,若相同再進行強校驗匹配。由於弱校驗的滾動特性可以快速地篩選出需要進行同步的數據塊。該算法的運算量主要集中在主機 A 上。
- 通過上述計算,主機 A 將文件的不同部分發送給 B,B 接收到兩個拷貝之間的不同之處,從而同步得到更新後的文件。
通過如上方式,rsync 避免了對相同數據的傳輸,減少了網絡帶寬的浪費。在時間上整個過程中需一個往返,從某種程度上也保證了 rsync 的優越性能。
用戶可從官方網站 http://rsync.samba.org/ 上下載安裝 rsync 的最新版本。使用時需將 rsync 分別安裝於服務端和客戶端,服務端和客戶端使用同一個 rsync 軟件包來實現遠程鏡像和定期同步更新。需要說明的是一個 rsync 服務端可同時備份多個客戶端的數據;多個服務端備份一個客戶端的數據。 rsync 默認端口爲 873,服務器在該端口接收客戶的匿名或者認證方式的備份請求。
rsync 服務端在使用之前需要進行必要的配置,其配置文件爲 /etc/rsyncd.conf,進行認證、訪問、日誌記錄等控制。配置文件包括全局參數、模塊參數的設置。 rsyncd.conf 文件中 [module] 之前的所有參數爲全局參數,也可以在全局參數部分定義模塊參數,在這種情況下該參數的值就是所有模塊的默認值。全局參數設置程序使用的端口號,指定消息文件、日誌文件 pid 文件以及發送日誌消息的級別。模塊參數主要定義服務端哪個目錄需要被同步。用戶可根據不同的需要指定多個模塊,每個模塊對應需要備份的一個目錄樹,即若有 N 個需要備份的目錄樹,則需要 N 個模塊與之對應。模塊中可以定義許多參數,常見參數如下。
表 4. rsyncd.conf 配置文件常見模塊參數列表
選項 | 描述 |
Comment | 模塊信息描述,該描述連同模塊名在客戶連接得到模塊列表時顯示給客戶。默認沒有描述定義。 |
Path | 指定供備份的目錄路徑,必須指定該參數。 |
max connections | 指定最大併發連接數以保護服務器,超過限制的連接請求將被告知隨後再試。默認值爲 0,即沒有限制。 |
log file | 指定日誌文件 |
read only | 設定是否允許客戶上載文件。若爲 true 任何上載請求均會失敗,若爲 false 且客戶端擁有服務器目錄讀寫權限則可以上載。默認值爲 true 。 |
write only | 設定是否允許客戶下載文件。若爲 true 任何下載請求均會失敗,默認值爲 false 。 |
List | 設定當客戶請求可以使用的模塊列表時,是否列出該模塊。若爲 false,則創建隱藏的模塊。默認值爲 true 。 |
fake super | 允許文件享有所有權限,而無需後臺服務以 root 權限進行操作。 |
Filter | 設置過濾列表以決定哪些文件可由客戶端訪問。 |
hosts allow | 指定允許客戶連接的 IP 地址。可以爲單個 IP 地址或整個網段。多個 IP 或網段需要以空格隔開。默認是允許所有主機連接。 |
dont compress | 指定不進行壓縮處理即可傳輸的文件,默認值是 *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz |
pre-xfer exec, post-xfer exec | 設置可在文件傳輸前/後執行的命令。若在文件傳輸前執行的命令失敗,則取消本次傳輸操作。 |
- 通過遠程 shell 方式:
- rsync [OPTION] [USER@]HOST:SRC DEST
- 使用遠程 shell(如 ssh, rsh)實現將遠程機器的內容拷貝到本地機器。 SRC 地址路徑中以單個冒號 ":" 進行分隔。
- rsync [OPTION] SRC [USER@]HOST:DEST
- 使用遠程 shell(如 rsh、ssh)實現本地機器的內容拷貝到遠程機器。 DEST 地址路徑中以單個冒號 ":" 進行分隔。
- 通過 rsync daemon 方式:
- rsync [OPTION] [USER@]HOST::SRC DEST 或
- rsync [OPTION] rsync://[USER@]HOST[:PORT]/SRC [DEST]
- 從遠程 rsync 服務器中拷貝文件到本地機。 SRC 地址路徑中以雙冒號 "::" 進行分隔。
- rsync [OPTION] SRC [USER@]HOST::DEST 或
- rsync [OPTION] SRC rsync://[USER@]HOST[:PORT]/DEST
- 從本地機器拷貝文件到遠程 rsync 服務器中。 DEST 地址路徑中以雙冒號 "::" 進行分隔。
如果 rsync 命令中只指定 SRC 參數而不指定 DEST 參數,則意爲顯示源文件列表而非進行同步拷貝。 rsync 有許多功能選項,常用的選項如下:
表 5. rsync 常用參數
選項 | 描述 |
-a, --archive | 歸檔模式,保持所有文件屬性,等同於 -rlptgoD |
-v, --verbose | 詳細信息輸出 |
-r, --recursive | 對子目錄進行遞歸處理 |
-R, --relative | 使用相對路徑信息 |
-b, --backup | 創建備份 |
-z, --compress | 對備份的文件在傳輸時進行壓縮處理 |
--delete | 用於同步目錄,從 DEST 中將 SRC 不存在的文件進行刪除 |
--progress | 顯示備份過程 |
- 查看服務端文件及列表
- # rsync 9.186.110.53::
查看服務端可用的模塊列表以及註釋信息
- # rsync [email protected]::www/
查看服務端 www 模塊中的目錄及文件列表(使用 rsyncd 用戶認證方式)
- # rsync [email protected]:/var/www/html/
查看服務端 /var/www/html 目錄中的內容(使用服務端的系統用戶進行驗證,如 ibmuser)
- # rsync 9.186.110.53::
- 保持客戶端與服務端的數據同步
- # rsync -avz [email protected]::www/ /backup1/
使用後臺服務方式將服務端 www 模塊下的內容備份到本地 /backup1 目錄中,備份時保留原有權限、屬性、屬主及符號連接等,並使用壓縮方式加快數據傳輸。
- # rsync – avz [email protected]:/var/www/html /backup2/
使用 ssh 方式將遠程的 /var/www/html 目錄備份到本地 /backup2/ 目錄下
- # rsync -avz --delete [email protected]::www/ /backup3/
將遠程 www 模塊備份到本地 /backup3/ 目錄中,同時進行同步目錄,刪除本地目錄中多餘的文件。
- # rsync -avz [email protected]::www/ /backup1/
當服務端的數據出現問題時,需要通過客戶端的數據對服務端進行恢復,只要客戶端有服務端的寫入權限,即可通過調換 rsync 命令的 SRC、DEST 參數進行恢復。
綜上所述,各種文件傳輸方式的特徵表現各有千秋,我們從以下幾個方面綜合對比,更深入地瞭解它們各自的特性。
- 傳輸性能
wget 通過支持後臺執行及斷點續傳提高文件傳輸效率 ; rsync 則以其高效的傳輸及壓縮算法達到快傳輸的目的。
- 配置難度
rcp 只需進行簡單的配置,創建 .rhost 文件以及設置 /etc/hosts 文件中主機名與 IP 地址列表; wget 設置設置方便簡單,只需在客戶端指定參數執行命令即可; rsync 在使用前需要對服務端 /etc/rsyncd.conf 進行參數設定,配置內容相對複雜。
- 安全性能
ftp、rcp 不保證傳輸的安全性,scp、rsync 則均可基於 ssh 認證進行傳輸,提供了較強的安全保障。 wget 也可通過指定安全協議做到安全傳輸。
通過上述的對比不難發現,每種文件傳輸方法基於其自身的特點與優勢均有其典型的適用場景:
- ftp 作爲最常用的入門式的文件傳輸方法,使用簡單,易於理解,並且可以實現腳本自動化;
- rcp 相對於 ftp 可以保留文件屬性並可遞歸的拷貝子目錄;
- scp 利用 ssh 傳輸數據,並使用與 ssh 相同的認證模式,相對於 rcp 提供更強的安全保障;
- wget,實現遞歸下載,可跟蹤 HTML 頁面上的鏈接依次下載來創建遠程服務器的本地版本,完全重建原始站點的目錄結構,適合實現遠程網站的鏡像;
- curl 則適合用來進行自動的文件傳輸或操作序列,是一個很好的模擬用戶在網頁瀏覽器上的行爲的工具;
- rsync 更適用於大數據量的每日同步,拷貝的速度很快,相對 wget 來說速度快且安全高效。
讀者可在不同的場合根據實際需要,選擇適合的文件傳輸方法。