2011年5月27日

深入淺出OpenSSH於日常工作的應用(二) 使用sftp傳輸檔案

上一篇文章說明ssh如何安裝及設定,本文則是分享如何用sftp取代ftp作為檔案伺服器。

FTP(File Transfer Protocol)檔案傳輸協定,過去是網路使用者交換檔案很常用的一種方式,許多網友會架設自己的私人FTP站台、當站長,並且在BBS或News Group徵求其他站長交換帳號。但現在已經很少人會這麼做,因為通常想找的檔案,都可以在論壇找到BT種子、ED2K連結,或利用eMule等其他P2P軟體內建搜尋功能,而Web化的檔案分享服務,以較方便的HTTP協定,就能提供檔案上傳、管理、下載等功能,絕大多數的人電腦都有安裝瀏覽器,但不一定安裝FTP軟體;即使瀏覽器內建FTP功能,但大多相當難用。

儘管FTP已不常用於大眾的檔案交換分享,但是對於伺服器、遠端工作站的使用者來說,還是經常需要透過FTP傳輸檔案,因為傳輸效率高、穩定、容易續傳。

對於Ubuntu Linux的使用者,只要安裝好openssh-server(如未安裝請參考此篇),啟用ssh服務後,其實就已經內建一組檔案傳輸服務,不需要再加裝其他FTP服務。

SFTP(SSH File Transfer Protocol)是ssh內建的檔案傳輸服務,同樣提供加密的安全傳輸服務,不像一般未加密FTP(FTP也有可加密版本)在傳輸過程採用明碼(帳號密碼及檔案內容可能遭到攔截),所以具有更好的安全性。雖然效能部分不如未加密的FTP,但是對於日常工作需要的檔案傳輸,其實也算足夠了。

在Linux及Mac OS X系統下,可以使用sftp指令建立連線。(yourname:你的帳號;servername:主機IP或HOSTNAME)
sftp yourname@servername

之後的操作指令與ftp類似,例如ls、cd、get、put、rm、mkdir、rmdir、quit等,可以參考sftp指令說明

當然在Linux下有加強版的lftp指令,還沒裝lftp可以先用apt-get裝上。
sudo apt-get install lftp

接著就可以用lftp連線到遠端sftp服務。
lftp sftp://yourname@servername/

lftp比起sftp或ftp指令加強了許多功能,例如mirror(複製整個資料夾)、queue(傳輸任務佇列)、限制頻寬用量等,可以參考lftp指令說明

圖形化介面的檔案傳輸工具軟體FileZilla,跨平台支援Windows、Linux及Mac OS X,也是相當不錯的選擇。

FileZilla同樣支援sftp功能,只需要在主機欄位輸入 sftp://yourname@servername/ 格式的位址。

ssh的sftp用途不僅如此,在Linux系統下,我們可以透過sshfs指令,將遠端ssh伺服器的資料夾「掛載」到本地主機的磁碟路徑下,不管是編輯、建立、搬移、複製檔案,雖然檔案實際儲存在遠端,但操作起來就像是在本地端的磁碟一樣方便。

安裝sshfs同樣只要一行指令!一行!
sudo apt-get install sshfs

接著建立一個新的remote資料夾,並且用sshfs掛載遠端sftp資料夾。(yourname:使用者帳號;servername:伺服器IP或HOSTNAME;/為遠端資料夾路徑,此為根目錄)
mkdir ~/remote
sshfs yourname@servername:/ ~/remote

之後就可以直接操作遠端資料夾,就像在本地端的磁碟一樣。
cd ~/remote
ls

請小心!這是直接對遠端的檔案系統操作,就像以sftp連線登入後一樣,並非複製,所以刪除檔案會真的把遠端的檔案也刪除。

如果不再繼續使用,則可以用umount指令卸載。
umount ~/remote

這樣做有什麼好處呢?

假設有一項Web專案,在工作站A開發,完成的檔案需要同時發佈到伺服器B、伺服器C、伺服器D三台主機,因為要利用三台伺服器進行平衡負載。

這種需求利用sshfs就可以非常非常輕鬆達到。

例如工作站A已經建好以下三個資料夾,並且都利用sshfs掛載B、C、D三台伺服器的遠端資料夾。
~/server_b
~/server_c
~/server_d

我們要只需要將專案完成的檔案,用一般的cp指令就能完成發佈和部署工作。
cp -rf ~/project/* ~/server_b/project
cp -rf ~/project/* ~/server_c/project
cp -rf ~/project/* ~/server_d/project

把這些指令寫成一個deploy.sh的腳本檔案,以後只要執行一道指令,就可以自動完成部署的任務。
./deploy.sh

由於遠端伺服器的資料夾,操作起來就跟本地端磁碟一模一樣,所以除了用cp複製檔案外,還可以結合其他工具如sed、awk等,很方便地進行自動化的設定調整(針對不同伺服器做設定調整)、維護(例如清除不再用到的暫存資料),或是以本地端的圖形化開發工具(如Eclipse)直接編輯檔案位於遠端伺服器的專案。

這對於P2P的牧場狂熱者,也有很不錯的應用方式,例如在A、B、C三地分別建置不同的Ubuntu Linux動物機,分別使用不同網路頻寬下載檔案,在檔案倉庫的主機,可以用sshfs掛載每一台動物機的資料夾,再配合crontab排程,利用凌晨不影響其他人網路使用的時段,自動將下載完成的檔案搬移到檔案倉庫。

1 則留言:

  1. FileZilla 不支援 SSH key 匯入的樣子 ?

    回覆刪除

lyhcode by lyhcode
歡迎轉載,請務必註明出處!