[Linux] curl 網路資料傳輸工具,常用指令範例教學


curl 」是一款藉由指定的網路協定,以指令/命令列方式來進行檔案傳輸的免費開源工具,目前已支援超過25種以上的網路協定,且Linux、Windows、macOS三大作業系統都有支援,以我自己使用的經驗來說,最常使用它來測試網站Web的資訊傳輸、測試API是否可以正常運作等,算是相當普遍且實用的工具,如果你的身份是個工程師、網管、IT相關工作的技術人員,那建議可以對這個工具有基本的認識,在工作上應該會有些幫助。

curl版本

官方網站:curl官網curl man page安裝檔下載
本文示範OS:Ubuntu 20.04 Server 英文版

curl 安裝

官方有提供不同平台的安裝檔下載,本文則以Ubuntu為例來進行安裝示範:

Linux – Ubuntu安裝curl

# 直接使用 apt 或 apt-get 進行安裝
sudo apt update && sudo apt upgrade
sudo apt install curl

安裝完成後可以使用 curl –version 來查看版本,並驗證有沒有安裝成功

參數說明

因參數很多無法一一陳列,本文會以常見或比較重要參數為主來做說明

參數 說明 用法
N/A 不帶參數就是使用GET方法,直接取得目的網站資訊 curl <目標網址>
-A, –user-agent 設定使用者代理 (User-Agent) –user-agent <name>
-d, –data 在POST的請求中,指定 <data> 到HTTP Server,這個參數預設會使用POST方法 -d <data>
-H, –header 指定header,例如在GET模式下,指定回傳JSON格式,則可使用 -H “Accept: application/json” -H <header/@file>
-I, –head 只取得(顯示)連線的Header資料 curl -I
-k, –insecure TLS、SFTP、SCP等協定在默認情況下curl會進行驗證,以確保連線中的傳輸是安全的。若使用此參數,則代表將跳過驗證步驟並繼續連線而不進行檢查。 curl -k
-L, –location 在HTTP/HTTPS連線中,如果Server回報請求的頁面已移動到不同的位置 (例如:3XX),此選項將使 curl 在新位置重做請求 curl -L
-o, –output Write output to <file> instead of stdout. 將連線的輸出資訊寫到指定的檔案中,以取代原本的寫入標準輸出(stdout)中 –output <file>
-u, –user 小寫u,指定用戶名和密碼來進行伺服器(Server)的身份驗證(Basic Authentication) -u <user:password>
-U, –proxy-user 大寫U,指定用戶名和密碼來進行代理伺服器(Proxy)的身份驗證 -U <user:password>
-v, –verbose 操作curl的過程中,顯示處理過程,取得較多的資訊以方便使用者判別 curl -v
-x, –proxy 小寫x,使用指定的Proxy連線 -x [protocol://]host[:port]
-X, –request 大寫X,指定request的方法,例如:GET、POST、PUT、DELETE等 -X <method>
–cacert 指定憑證檔案,用該憑證來驗證對方的憑證是否有效,例如:用CA的憑證來檢測網站的憑證是否正確 –cacert <file>
–stderr 將所有寫入 stderr 的內容重新定向到指定的文件,若參數後面是接「-」符號,則會寫到標準輸出 stdout 中 –stderr <file>

實務範例

範例 1

取得Google首頁的網站內容 (預設是GET模式)

curl https://www.google.com
範例 2-A

指定User-Agent的資訊,有時候連線會被拒,可透過此設定來進行偽裝

curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/81.0" https://example.com
範例 3-H

指定Header

curl -H "Content-Type: application/json" www.example.com

若有多個Header值要設定,則用連續的「-H」或「–header」來設定即可,而後面的字串要用單引號或者雙引號來包住都可,指令太長的話可以利用「\」來換行

curl -H "Accept: application/json" \
--header 'Token: Thisisatoken12345' \
www.example.com
範例 4-I

只顯示連線的Header資訊

curl -I https://www.google.com.tw
範例 5-L

連線時有時會被導向到新位置(自動跳轉),出現「3XX」的HTTP Code,如下畫面

curl HTTP Redirect

這時可以加入「-L」以便在新位置中重做請求

curl -L https://example.com
範例 6-X-d

大寫參數「-X」,如上面的表格說明,此參數可用來指定不同的連線方法,例如用「POST」來傳送資料,後面搭「-d」的加入要傳送的資料

curl -X POST https://example.com/post/api \ 
-H 'Content-Type: application/json' \
-d '{"key_1":"value_1","key_2":"value_2"}'

在傳送資料方面,也可以利用「-d @filename」從檔案讀取內容來傳送

curl -H "Content-Type: application/json" \
-X POST -d @data.json http://example.com
範例 7-k

curl在做網站連線的時候,為了安全性,預設會進行憑證的驗證,所以如果你沒有可信任的憑證,例如:CA憑證,那麼有可能就會造成連線失敗,尤其是出現在一些網站的憑證不是由知名的CA所簽發,或者網站的憑證是使用自簽憑證時(self-signed certificate),這類連線失敗的情況就很容易出現,如下畫面:

curl 憑證驗證失敗

而如果你的情況是只要做連線測試,或者可以接受不驗證憑證的風險,那麼可以使用-k來略過憑證的檢查

curl --location --request GET -k 'https://192.168.0.14:12345'
範例 8-o

將連線資訊寫入到指定的檔案中,這特別適用在當連線資訊量很大的時候,寫到檔案中比較容易查看

curl -o output.txt https://www.google.com
範例 9-u

當連線需要基本驗證時(Basic Authentication),利用「-u–user」來指定帳密

curl -u username:password http://example.com

如果只輸入帳號,則執行後會出現請輸入密碼的提示畫面

curl -u username http://example.com
範例 10-x-U-L

小寫參數「-x」,指定連線用的Proxy,語法是[protocol://]host[:port],在這語法中host前綴部分可以指定連線的協定(protocol),例如:http:// 或 socks5:// 等,如果沒有指定的話,則會以 HTTP 協定作為預設值,而port如果沒有指定的話,則預設值是1080

curl -x http://proxy.example:1234 https://example.com
或
curl -x proxy.example:1234 https://example.com

Proxy需要身份驗證的話,則利用「-U–proxy-user」來加入帳密

curl -U username:password -x http://proxy.example:1234 -L https://example.com

另一種寫法是把帳密合併到Proxy中,然後用「@」隔開

curl -x http://username:[email protected]:1234 -L https://example.com
範例 11–cacert

上面的例子有提到略過驗證憑證的方法,而在這個例子中,你可以透過「–cacert」來指定憑證,來驗證對方的憑證是否有效

curl --cacert ca.pem https://192.168.0.10:1234
範例 12–stderr-v

將連線的 stderr 資訊輸出到檔案中 (output.txt)

curl --stderr output.txt https://www.google.com

如果參數後面是接「」符號而非檔名,則會將資料寫入到標準輸出(stdout)中,這樣做的好處是你可以利用這些輸出再做進一步的操作,例如以下範例就可以篩選出「SSL」的相關字串

大家可以用以下指令比較一下,加和不加「–stderr -」的差別

curl --verbose --stderr - https://www.google.com | grep SSL

順便補充一下,透過上面的指令也可以用來檢測連線時憑証是否正常,如果是正常的話,連線資訊會含有「SSL certificate verify ok.」的字串

curl SSL certificate verify ok

又或者使用「2>&1」來控制輸出,因此上個指令可以改寫成如下:

curl -v -k https://google.com.tw 2>&1 | grep SSL

另一個例子是查詢憑證的一般名稱(subject)與到期日(expire)

curl -v -k https://google.com.tw 2>&1 | grep -E "subject|expire"
延伸閱讀
測試網站
  • badssl.com(用來測試一些異常的憑證)
  • SSL.COM (驗證有效或過期憑證)