「 curl 」是一款藉由指定的網路協定,以指令/命令列方式來進行檔案傳輸的免費開源工具,目前已支援超過25種以上的網路協定,且Linux、Windows、macOS三大作業系統都有支援,以我自己使用的經驗來說,最常使用它來測試網站Web的資訊傳輸、測試API是否可以正常運作等,算是相當普遍且實用的工具,如果你的身份是個工程師、網管、IT相關工作的技術人員,那建議可以對這個工具有基本的認識,在工作上應該會有些幫助。
官方網站: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
安裝完成後可以使用
參數說明
因參數很多無法一一陳列,本文會以常見或比較重要參數為主來做說明
參數 | 說明 | 用法 |
---|---|---|
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 -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"}'
在傳送資料方面,也可以利用「
curl -H "Content-Type: application/json" \
-X POST -d @data.json http://example.com
範例 7-k
curl在做網站連線的時候,為了安全性,預設會進行憑證的驗證,所以如果你沒有可信任的憑證,例如:CA憑證,那麼有可能就會造成連線失敗,尤其是出現在一些網站的憑證不是由知名的CA所簽發,或者網站的憑證是使用自簽憑證時(self-signed certificate),這類連線失敗的情況就很容易出現,如下畫面:
而如果你的情況是只要做連線測試,或者可以接受不驗證憑證的風險,那麼可以使用
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),利用「
curl -u username:password http://example.com
如果只輸入帳號,則執行後會出現請輸入密碼的提示畫面
curl -u username http://example.com
範例 10-x -U -L
小寫參數「-x」,指定連線用的Proxy,語法是
curl -x http://proxy.example:1234 https://example.com
或
curl -x proxy.example:1234 https://example.com
Proxy需要身份驗證的話,則利用「
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
上面的例子有提到略過驗證憑證的方法,而在這個例子中,你可以透過「
curl --cacert ca.pem https://192.168.0.10:1234
範例 12–stderr -v
將連線的 stderr 資訊輸出到檔案中 (output.txt)
curl --stderr output.txt https://www.google.com
如果參數後面是接「
大家可以用以下指令比較一下,加和不加「–stderr -」的差別
curl --verbose --stderr - https://www.google.com | grep SSL
順便補充一下,透過上面的指令也可以用來檢測連線時憑証是否正常,如果是正常的話,連線資訊會含有「SSL certificate verify ok.」的字串
又或者使用「
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 (驗證有效或過期憑證)