我之前一直想找一套不錯的 FTP 傳檔工具,我說的不是 FileZilla 這種 GUI 工具,而是可以透過批次檔自動完成 FTP 檔案傳輸的 CLI 工具。最近終於讓我找到了一套非常理想的 LFTP 工具,不但支援多種 FTP 通訊協定,其內建的命令與參數也超級多,功能強大好用,今天這篇文章我們就來介紹這套好用的 FTP 命令列工具!👍
安裝 LFTP 工具
-
Windows
由於 LFTP for Windows 問題很多,建議不要在 Windows 安裝這套工具,你只要透過 WSL 執行 lftp
即可使用,也非常方便!
-
Ubuntu Linux
sudo apt install lftp
-
Red Hat Enterprise Linux (RHEL) 8
sudo dnf install lftp -y
-
CentOS or Red Hat Enterprise Linux (RHEL) 7
sudo yum install lftp -y
-
macOS
MacPorts
sudo port install lftp
Homebrew Formulae
brew install lftp
體驗 lftp 的互動式 CUI 介面
-
進入 lftp 互動式 CUI 介面
lftp
若加上 -d
參數則代表進入 debug
偵錯模式,會顯示完整的 FTP 執行命令
lftp -d
上述命令都只是進入 lftp 的互動式 CUI 介面而已,還沒有對遠端 FTP Server 進行連線。
-
在 lftp 互動模式下輸入命令
# 啟用等級 10 的偵錯技術並寫入 debug.log 檔案
debug -o debug.log 10
# 連接站台
open myftp.servername
# 輸入帳號密碼
user username password
# 進入資料夾
cd /site/wwwroot
# 列出當前目錄的檔案或子目錄清單
ls
# 設定傳檔時可以自動覆蓋同名檔案
set xfer:clobber on
# 自動下載所有當前目錄下的所有檔案
mget *.html
# 設定用 mirror 整批下載時要用幾條連線平行下載檔案
set mirror:use-pget-n 5
# 自動下載所有當前目錄與其子目錄下的所有檔案
mirror .
如果要批次上傳整個資料夾到 FTP 站台,可以在互動模式下輸入以下命令:
mirror -R .
-
進入 lftp 互動式 CUI 介面並直接建立連線的方法
可以直接輸入帳號密碼與主機名稱直接連線並登入,甚至可以直接進入遠端的 FTP 資料夾路徑
lftp -u 'username,password' myftp.servername/remote/path
由於預設 lftp 會優先採用比較安全的 TLS
加密連線,若你的 FTP Server 沒有支援 TLS 的話,可以用 ftp://
來表達主機位址
lftp -u 'username,password' ftp://myftp.servername/remote/path
帳號密碼部分也可以用標準 Bash Auth 的格式來連線
lftp 'ftp://username:password@myftp.servername/remote/path'
-
使用 WSL 的注意事項 (Windows)
在 Windows 透過 WSL 執行 lftp 時,在輸入帳號密碼的時候很有可能會出現問題,只要你的帳號或密碼有出現 \
或 $
等特殊字元,就可能會出現無法登入的狀況。
我舉個例子來說,我們在 Azure Web App 下載的發行設定檔,當中的 FTP 帳號是這種格式:
sitename\$sitename
如果你用以下命令登入就會失敗:
wsl lftp -u 'sitename\$sitename,password' waws-prod-hk1-001.ftp.azurewebsites.windows.net/site/wwwroot
錯誤訊息會是:
cd: Login failed: 530 User cannot log in.
你可以用 echo
來測試看看實際傳入 WSL 執行的命令為何,你將會發現反斜線(\
)不見了!
PS> wsl echo lftp -u 'sitename\$sitename,password' waws-prod-hk1-001.ftp.azurewebsites.windows.net/site/wwwroot
lftp -u sitename$sitename,password waws-prod-hk1-001.ftp.azurewebsites.windows.net/site/wwwroot
所以正確的寫法變成以下這樣,就可以正常登入了!
wsl lftp -u 'sitename\\\$sitename,password' waws-prod-hk1-001.ftp.azurewebsites.windows.net/site/wwwroot
登入之後趕快加入書籤(Bookmark),之後就不用再輸入帳號密碼了,讓我們繼續看下去!
使用 lftp 的書籤功能
lftp 內建書籤功能,他可以把目前 lftp 連接成功的站台位置、帳號密碼、遠端資料夾路徑,全部紀錄下來!👍
以下是建立書籤的步驟:
-
先連入 FTP 站台、通過驗證並進入 /site/wwwroot
資料夾
lftp -u 'username,password' myftp.servername/site/wwwroot
帳號密碼部分用逗號分隔(,
)
-
從 lftp 的 CUI 介面透過 bookmark
命令建立書籤
bookmark add mysite
這些加入的書籤在 Ubuntu 的話預設會存放在 ~/.local/share/lftp/bookmarks
檔案中,你也可以手動編輯該檔。
日後要使用書籤來進行連線,就很方便了,建議多加利用!👍
-
透過書籤連接 FTP 站台
先連上 lftp 的 CUI 介面
lftp -d
使用 bookmark list
查詢所有書籤
bookmark list
透過 open
命令連接特定書籤
open mysite
-
從 Shell 直接透過書籤連接 FTP 站台
lftp mysite
-
從 Shell 取得 lftp 書籤清單
lftp -c bookmark list
這裡的 -c
是立即執行 lftp command 並直接退出的意思
-
從 Shell 編輯 lftp 書籤
這個命令會開啟預設文字編輯器,讓你直接編輯書籤檔
lftp -c bookmark edit
直接在 Shell 環境下操作 lftp
-
快速建立連線並執行指定命令
這裡的 -c
是立即執行 lftp 的 command 並直接退出的意思。不過以下這個命令有點特別,我們在 -c
的參數值中用到了 open
命令,並透過 -e
帶入一個連線後要執行的命令(Expression)。這個命令 open -e "ls" mysite
所代表的意思是,先開啟 FTP 連線到 mysite
書籤,連線後立刻在 lftp 裡面執行 ls
命令:
lftp -c 'open -e "ls" mysite'
若有多組 lftp 命令要執行,可以用分號間隔(;
),他就會依序執行。例如:
lftp -c 'open -e "echo List;ls;cd ..;echo List Parent Folder;ls" mysite'
-
批次下載遠端資料夾 (包含所有子資料夾)
lftp -c 'open -e "mirror ." mysite'
如果檔案數過多,可以考慮用多條連線平行下載,執行前設定 lftp 的 mirror:use-pget-n
選項即可:
lftp -c 'open -e "set mirror:use-pget-n 5; mirror ." mysite'
-
批次上傳檔案到遠端 (包含所有子資料夾)
lftp -c 'open -e "mirror -R ." mysite'
如果檔案數過多,可以考慮用多條連線平行下載,執行前設定 lftp 的 mirror:use-pget-n
選項即可:
lftp -c 'open -e "set mirror:use-pget-n 5; mirror -R ." mysite'
透過 lftp 進行批次操作
如果你的 FTP 操作很固定,但是步驟很複雜,那就可以改用 Script (腳本) 的方式執行,其設定步驟如下:
-
先準備所有你要對 FTP 伺服器操作的命令清單,並儲存成 *.lftp
檔案
建立一個檔名為 getfiles.lftp
# 啟用等級 10 的偵錯技術並寫入 debug.log 檔案
debug -o debug.log 10
# 連接站台
open myftp.servername
# 輸入帳號密碼
user username password
# 進入資料夾
cd /remote/path
# 列出當前目錄的檔案或子目錄清單
ls
# 設定傳檔時可以自動覆蓋同名檔案
set xfer:clobber on
# 自動下載所有當前目錄下的所有檔案
mget *.html
# 會到上一層
cd ../Diagnostics/
# 列出遠端目錄的檔案清單
ls
# 在本地端建立資料夾
!mkdir Diagnostics
# 移動本地端預設目錄
lcd Diagnostics
# 取得 settings.json 檔案並儲存到 Diagnostics 資料夾下
get settings.json
# 移動本地端預設目錄到上一層
lcd ..
# 取得遠端檔案內容
cat README.md
-
執行批次命令
lftp -f getfiles.lftp
這裡加上 -f
的目的就是會讓批次命令執行完後自動退出。
總結
LFTP 還有好多功能,像是 Slots 功能也很帥,你可以在互動介面中切換多台不同的 FTP 伺服器連線,快速的切換與上傳下載檔案,真的非常酷。
我最喜歡 LFTP 的地方就是他很容易的可以幫我實現 FTP 的自動化作業,寫個 *.lftp
腳本丟進 lftp
來執行,再複雜的操作也不怕!👍
相關連結