可FTP同步的LFTP軟體
內容目錄
🚀【LFTP 教學】沒有 Rsync 怎麼辦?打造你的專屬「FTP 智能搬家公司」全攻略
🔥 一句話總結懶人包: 當你的遠端主機只給你開放最古老的 FTP 連接埠,卻又渴望擁有像 rsync 那樣「自動比對、斷點續傳、資料夾鏡像同步」的聰明功能時,LFTP 絕對是你唯一的神級救星! 而且它不只會傳檔案,還能排程自動化、串接雲端硬碟,甚至幫你避開重複上傳的地雷 🎯。
在 Linux 終端機的世界裡,傳輸檔案的工具千百種:有人愛用 NcFTP 一行指令快速上傳,有人自家主機直接用 rsync 搞定備份。但如果你今天遇到一台「只開放 FTP/SFTP 連接埠,死都不給你 SSH 直連權限」的固執主機,卻又想要每天、每小時,甚至每 5 分鐘自動備份一次,該怎麼辦呢?這時候,LFTP 這套從 1996 年就存在、養兵千日的強悍命令列 FTP 用戶端就能派上大用場了 🤖🤓🤖!
一般的 FTP 軟體(例如老牌的 FileZilla)就像是「傳統的搬家工人」,你叫他搬 10 箱東西,他就乖乖搬 10 箱,就算裡面有 9 箱昨天已經搬過了,他還是會傻傻地整箱重搬一次,白白浪費時間跟力氣。
而 LFTP 就像是一間「高科技智能物流公司」🚚:它不僅具備 Rsync 等級的精準比對能力(只搬有變動過的箱子),還能同時派出好幾組搬家工人(多執行緒併發傳輸),甚至可以直接叫 A 倉庫的員工把貨物「直送」到 B 倉庫,完全不用先繞回你家(這招叫 FXP,後面會講到),幫你省下大把的頻寬與時間!
🛠️ 第一階段:LFTP 基礎安裝
-
❶ 匯入 EPEL 套件庫並安裝(以 CentOS 為例)
安裝 LFTP 其實非常簡單,只要確保你的系統已經掛載了 CentOS 官方認可的 EPEL(Extra Packages for Enterprise Linux)套件庫即可。這個套件庫就像是「官方認證的社區團購中心」,裡面收錄了很多官方標準倉庫沒有內建的實用軟體。請在 SSH 終端機中依序輸入以下指令:sudo yum remove -y epel-release sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm sudo yum-config-manager --enable epel
最後,下達安裝指令,幾秒鐘就能把這套神器請入伺服器中了!
yum install -y lftp💡 其他系統別擔心,安裝方式一樣親切:
如果你用的是 Ubuntu/Debian 系統,就像去「另一間超商」買東西一樣,指令換成:sudo apt -y update && sudo apt install -y lftp
如果你是 macOS 使用者,用 Homebrew 這個「蘋果專屬雜貨店」也能一秒裝好:brew install lftp
⚙️ 第二階段:基本語法與「腳本自動化」實戰
LFTP 最強大的地方在於它的指令列控制能力,幾乎所有操作都能被寫成腳本,讓電腦自己半夜爬起來幫你搬檔案。以下是它的標準起手式語法:
lftp [-d] [-e cmd] [-p port] [-u user[,pass]] [site] lftp -f script_file lftp -c commands
📊 常用啟動參數白話分解
| ⚙️ 參數名稱 | 📖 實際作用 |
|---|---|
| -p | 指定遠端 FTP 主機提供的連接埠(例如自訂的 Port 2121)。 |
| -u | 輸入帳號與密碼,格式為 使用者,密碼。如果不加上此參數,LFTP 會預設嘗試用「匿名模式(Anonymous)」登入。 |
| -f | 執行寫好的純文字腳本檔(Script),自動化備份全靠它! |
| -c | 後面直接接上想要執行的指令字串,適合單次快速操作。 |
| -e | 用分號串接多個指令一次執行,例如 -e “put a.txt; bye”,適合寫在一行 Bash 腳本裡。 |
-
❷ 建立自動化備份腳本(Script)
懂了基本參數後,我們可以把複雜的下載指令寫成一個文字檔,未來就能搭配 cronjob 實現全自動排程備份了!這就好比把「今天要買的菜」寫成一張清單交給採買員,而不是每次都要口頭交代一遍。
我們建立一個名為 lftp.txt 的檔案,內容如下:open qoo.com -p 21 -u qoo_user,qoo_pw lcd /backup/520.be/ cd /web/www/520.be/ mirror -c exit
接著只要執行以下指令,系統就會照著腳本一步一步幫你把遠端資料同步回本地端:
lftp -f /root/lftp.txt
💡 腳本語法小提示:
lcd 代表切換「本地端(Local)」的儲存目錄;而 cd 則是切換「遠端 FTP」的目錄。最後呼叫 mirror -c 進行斷點續傳的鏡像同步。如果想反向「上傳檔案到遠端」,只要把 mirror -c 改成 mirror -cR 就可以了! -
❸ 進階寫法:用「Here Document」一次餵指令給 LFTP
如果你不想額外建立一個獨立的 lftp.txt 檔案,也可以直接把指令包在 Bash 腳本裡面,透過 <<EOF 這種「即席便利貼」的寫法,把一整串指令一次性塞進 LFTP 的嘴裡:#!/bin/bash FTP_HOST="ftp.example.com" FTP_USER="username" FTP_PASS="password" LOCAL_FILE="/path/to/local/file" REMOTE_FILE="/path/to/remote/file" lftp -u $FTP_USER,$FTP_PASS ftp://$FTP_HOST <
💡 白話文教室:這跟前面的 -f 腳本檔有什麼不同?
用獨立腳本檔(-f)就像是請秘書照著「一份寫好的公文」辦事,適合長期重複使用、方便維護;而 Here Document 則像是你當場「口頭交代完整流程」給秘書聽,指令跟 Bash 邏輯(例如變數、判斷式)能寫在同一支程式裡,適合需要跟其他 Bash 邏輯搭配使用的情境。兩種寫法效果相同,看個人習慣選用即可。
🛡️ 核心必殺技:三大神級指令詳解
一、Mirror 鏡像同步指令(Rsync 的完美替代品)
語法:mirror [參數] [來源目錄 [目標目錄]]
鏡像(Mirror)就像是聘請了一位擁有強迫症的「超級收納管家」🧹。他會嚴格比對你本地端(自家倉庫)跟遠端 FTP(雲端保險箱)的檔案狀態,只會下載或上傳「缺少」或「時間較新」的檔案,完全不浪費時間重傳一模一樣的東西!
Mirror 支援的細部參數非常多,這裡幫大家整理出最實用的清單(如果目標目錄最後有加上斜線 /,來源目錄的名稱會被附加到目標名稱之後):
| 🛠️ Mirror 參數 | 📖 作用說明 |
|---|---|
| -c, --continue | 支援斷點續傳(網路斷掉也不用重頭來)。 |
| -e, --delete | 強制同步:比較遠端和本地端的檔案,如果遠端沒有的檔案,就直接刪除本地端的檔案(保持兩邊完全一致)。 |
| -R, --reverse | 反向鏡像:也就是將本地端資料「上傳」至遠端 FTP。 |
| -n, --only-newer | 只下載比本地端「還新」的檔案(注意:此時 -c 斷點續傳選項將會無效)。 |
| --only-missing | 只下載本地端「缺少」的檔案。 |
| -P, --parallel[=N] | 並行下載:同時開啟 N 個通道來下載多個檔案。 |
| --size-range=RANGE | 進階過濾:只下載指定大小範圍內的檔案。 |
| --ignore-time | 忽略時間戳記判斷(搭配 --only-newer 上傳時特別有用,原因見下方實戰案例)。 |
| --Remove-source-files | ⚠️ 謹慎使用: 檔案傳輸完成後,直接把來源端的檔案刪除。 |
| -s, --allow-suid | 儲存遠端 FTP 檔案的屬性,嘗試保留權限設定。 |
| -x RX, --exclude | 利用正規表示式(Regex)來排除不需要下載的檔案。 |
※ 其他次要參數還包括:--delete-first(先刪舊檔再傳新檔)、--depth-first(先進入子目錄再傳檔)、--ignore-size、--no-empty-dirs、-r(不進入子目錄)、--no-symlinks、-p(不設定權限)、-L(將捷徑視為實體檔案下載)、-N(只下載特定時間後的檔案)、--on-change=CMD(有變動時執行外部指令)等等。
🎯 實戰案例:架站族最怕的「重複上傳」地雷,一次拆解
很多人會發現,就算已經加了 --only-newer,用 mirror -R 反向上傳網站時,LFTP 還是每次都把整個網站「刪掉重傳」一遍,速度慢到懷疑人生。這是因為上傳時,伺服器沒辦法幫你保留原始檔案的時間戳記,導致 LFTP 每次比對時間都覺得「這是新檔案」。
這就像管家在比對「出生年月日」來判斷這是不是同一個人,但上傳之後身分證上的出生年月日卻被系統自動改成「今天」,管家每次都覺得是個新面孔,只好每次都重新登記造冊一次。
解法很簡單,只要同時加上 --only-newer --ignore-time 這兩個參數搭配使用,改成比對「檔案大小」而不是時間,就能真正做到只上傳有異動過的檔案:
mirror -v --only-newer --ignore-time --delete --reverse _site/ /public_html/
✅ 真實成效參考:有部落客實測過,套用這個組合技之後,網站部署時間直接從 5.5 分鐘砍到 2 分鐘,足足省下超過一半的時間!唯一要注意的小陷阱是:如果兩個檔案「內容不同但檔案大小剛好一樣」,還是有可能被誤判成沒有變動,這點務必留意。
🚀 實戰案例:45 秒搬完 2GB 網站素材庫的秘密武器 FXP
LFTP 還藏著一項殺手級功能:FXP(伺服器對伺服器直傳),也就是讓「來源主機」跟「目的地主機」直接對話搬東西,完全不需要繞道經過你自己的電腦。
一般搬家流程是「舊家 → 你自己的貨車 → 新家」,你的貨車頻寬(家用網路)往往就是最大的瓶頸。FXP 則是直接請「舊家的貨運公司」把貨物直接送到「新家」,完全跳過你自己那台又小又慢的貨車,速度自然快到飛起。
有位工程師實測過:把超過 2GB 的圖片素材庫,從自己在雲端主機商上的伺服器,透過 LFTP 搬到 WPEngine 代管主機,整個過程只花了大約 45 秒!關鍵指令就是先連進「目的地」主機,再用 mirror -R --parallel=4 把來源主機的內容整批「反向鏡像」上傳過去:
lftp -e "set sftp:auto-confirm yes;" sftp://USERNAME@target-host.example.com:2222 mirror -R --parallel=4
※ 上面範例先進入目的地主機,並用 -R 反向鏡像把「目前所在目錄」上傳過去,同時開 4 個平行連線加速傳輸。
二、pget 多執行緒暴力下載
語法:pget [參數] 遠端檔案 [-o 本地檔案]
這就像去大賣場買一組超巨大的沙發。傳統 FTP(單線程)只能派一個員工慢慢搬;而 pget 會直接呼叫 5 到 10 個搬家工人(多執行緒),把沙發拆分成好幾塊同時透過不同的通道運送,最後在你的電腦裡瞬間組裝好,速度直接衝破天際!
- -c:支援斷點續傳。
- -n:指定使用幾個線程來暴力下載(預設為 5 個)。
- -o:指定下載回來的檔案儲存位置與檔名。
🔥 一行神速下載範例:
lftp -c 'pget -c -n 10 http://s3.hicloud.net.tw/document/hiclouds3_%E5%BF%AB%E9%80%9F%E5%85%A5%E9%96%80%E6%8C%87%E5%8D%97.pdf -o /web/www/520.be/hiclouds3_快速入門指南.pdf'
三、mget / mput 批次處理神技
如果你不想用 Mirror 掃描整個資料夾,只是想利用萬用字元(如 *.jpg)抓取或上傳特定檔案,就可以使用 mget(多個下載)與 mput(多個上傳)。
- -c:斷點續傳。
- -d:自動建立與檔名相同的目錄,並將檔案放進去(而不是放在當前目錄)。
- -a:強制使用 ascii 模式傳輸(LFTP 預設為 binary 二進位模式)。
- -O <base>:指定基礎儲存位置。
- -E:⚠️ 謹慎使用: 傳輸完成後,直接刪除來源檔案(過河拆橋大法)!
🔧 實用環境設定與「阿薩布魯」雜項指令
在 LFTP 的提示字元底下,你還可以透過 set 指令來調整系統的全域設定,尤其是遇到令人頭痛的中文亂碼時,這招一定要學起來:
# 解決遠端 FTP 顯示亂碼(可改用 big5 繁體中文,或 gbk 簡體中文) set ftp:charset UTF-8 # 設定本地端檔案列表的編碼 set file:charset "UTF-8" # 限制上傳與下載的極速 各為 10KB/s(不怕吃光伺服器頻寬) set net:limit-rate 10000,10000
🗃️ 其他日常必備管理指令總整理
| ⌨️ 指令語法 | 📖 功能說明 |
|---|---|
| ! shell command | 執行本地端(Local)的 Shell 命令(例如 LFTP 沒有 lls,可用 !ls 替代)。 |
| alias / bookmark | 自定義別名與設定 FTP 書籤,方便下次快速連線。 |
| cat, more, zcat, zmore | 直接在終端機查看遠端 FTP 裡面的文字檔內容。 |
| cd / lcd | 切換遠端目錄(cd)/切換本地端目錄(lcd)。 |
| pwd / lpwd | 顯示遠端當前目錄(pwd)/顯示本地端當前目錄(lpwd)。 |
| ls / !ls | 顯示遠端檔案列表/顯示本地端檔案列表。 |
| chmod mode files | 更改遠端 FTP 的檔案或目錄權限。 |
| mkdir [-p] / rmdir | 建立遠端目錄(加 -p 可連同子目錄一起建)/刪除遠端目錄。 |
| mv file1 file2 | 移動遠端檔案,這招也常被用來當作「重新命名」使用。 |
| rm [-r] [-f] files | 刪除遠端檔案(加 -r 遞迴刪除整個目錄;-f 強制且不顯示錯誤訊息)。 |
| mrm | 一次刪除多個遠端檔案,完美支援 * 萬用字元。 |
| du | 計算遠端 FTP 目錄佔用的空間大小。 |
| exit | 安全登出並退出 LFTP 程式。 |
如果想深入研究更多隱藏參數,你隨時可以在 SSH 終端機敲下 man lftp 來召喚官方說明書,或是前往線上說明手冊查閱:
👉 http://tutorials.papamike.ca/pub/lftp.html
🎭 進階實戰情境:排程、雲端整合與異常處理
學會了基本指令只是第一步,真正讓 LFTP 發光發熱的地方,是把它塞進「全自動化」的工作流程裡。以下整理幾個台灣站長最常遇到的實戰情境:
㊀ 用 Cron 排程,打造 5 分鐘自動同步機
Cron 就像是幫你的伺服器裝了一個「鬧鐘管家」⏰,你只要事先設定好「每 5 分鐘」、「每天凌晨 3 點」等時間規則,管家就會自動叫醒 LFTP 去搬一次檔案,完全不用你人工盯著看。
假設你想要每 5 分鐘自動把遠端資料鏡像回本機,可以先寫好一個 Bash 腳本 pull_from_ftp.sh:
#!/bin/bash lftp -e "mirror -c -e --parallel=20 --verbose /pub/data/remote/prod /local/backup/prod;quit;" ftp.example.com
接著執行 crontab -e -u <user>,在檔案最後加上一行排程規則:
*/5 * * * * /home/username/pull_from_ftp.sh
※ 若想改成「每天凌晨 3 點 15 分」執行一次,只要把時間欄位改成 15 3 * * * 即可。
㊁ 串接雲端硬碟:以 Box 為例的雲端搬家術
除了傳統 FTP/SFTP 主機,LFTP 也能透過 FTPS 協定直接跟像 Box 這樣的雲端硬碟服務對話,很適合沒有圖形介面的伺服器環境(例如高效能運算叢集 HPC)進行大量資料搬移。
瀏覽器上傳就像徒手搬家,網路一斷線、瀏覽器一當機,進度可能就直接歸零重來。LFTP 則像請了專業搬家公司,自動處理斷線重試、大檔案分批傳輸,就算是幾千個檔案也不怕搬到一半掛掉。
mkdir ~/.lftp echo -e \ 'set ftps:initial-prot "" set ftp:ssl-force true set ftp:ssl-protect-data true' >> ~/.lftp/rc
設定好安全連線參數後,就能用你的雲端硬碟帳號登入並操作:
lftp ftps://your-email@ftp.box.com # 上傳整個本地資料夾到雲端硬碟 mirror -R /path/to/local/directory /path/to/cloud/directory # 把雲端硬碟的資料夾整批下載回本機 mirror /path/to/cloud/directory /path/to/local/directory
㊂ 模擬真人操作:用 expect 搞定互動式確認提示
有些傳輸情境會跳出「是否要覆蓋檔案?」之類的互動式提示,等著人工按下確認鍵,這對全自動排程來說是個大麻煩。這時候可以搭配 expect 這套小工具,讓程式自己假裝是個真人使用者去應答。
就像請了一個「分身機器人」24 小時守在電腦前,一看到螢幕跳出「請按 Y 確認」的視窗,機器人就立刻自動幫你按下去,完全不需要真人在電腦前值班等待。
set timeout 60
set prompt "lftp *"
spawn lftp -u $env(FTP_USER),$env(FTP_PASS) ftp://$env(FTP_HOST)
expect {
$prompt { send "put $env(LOCAL_FILE) -o $env(REMOTE_FILE)\r" }
timeout { puts "Timed out"; exit 1 }
}
send "bye\r"
expect eof
㊃ 錯誤處理與日誌紀錄:讓自動化腳本學會「回報現況」
全自動排程最怕的就是「靜悄悄地失敗」,你完全不知道昨晚的備份到底有沒有成功。加上簡單的錯誤判斷跟日誌紀錄,就能讓腳本學會自己回報結果:
#!/bin/bash
LOG_FILE="/path/to/logfile.log"
lftp -u $FTP_USER,$FTP_PASS ftp://$FTP_HOST -e "put $LOCAL_FILE -o $REMOTE_FILE; bye" >> $LOG_FILE 2>&1
if [ $? -eq 0 ]; then
echo "檔案傳輸成功 ✅" >> $LOG_FILE
else
echo "檔案傳輸失敗 ❌" >> $LOG_FILE
fi
🚨 畫重點!千萬別踩雷: 帳號密碼直接寫死在腳本裡(明碼),就像把家裡鑰匙貼在大門口一樣危險!正式上線環境建議改用 SSH 金鑰驗證,或至少把帳密存放在權限受限的獨立設定檔/環境變數中,並確保該檔案不會被誤傳到公開的版本控制庫(例如 GitHub)裡。
📚 延伸總結:什麼情境該選 LFTP?
看完這麼多招式,簡單幫大家歸納一下使用時機:如果你手上的遠端主機「只給 FTP/SFTP,不給 SSH」,或是你需要在兩台遠端主機之間直接搬資料(FXP),又或者你想把繁瑣的檔案同步工作交給 Cron 全自動完成,LFTP 幾乎都是目前最務實的解方。如果對方主機剛好支援 SSH,那麼 rsync 依然是效能與檢查機制(逐位元組比對)更精準的首選,兩者互補使用即可。



