TShopping

 找回密碼
 註冊
搜索
查看: 122|回復: 0

[CentOS] Linux Curl 超詳細教學(常用篇)

[複製鏈接]
發表於 2024-9-25 11:22:51 | 顯示全部樓層 |閱讀模式
 
Push to Facebook

Linux Curl 詳細教學

Linux Curl  詳細教學
小編公司自從導入雲端服務後,Curl 指令直接變成最常使用的指令之一,用來分析網頁行為及研究跳轉和參數等等超級好用,避免瀏覽器智慧跳轉等等功能問題。
但認真做了功課才發現Curl參數超級多,同時才發現自己只有使用到部分功能,先將常用的部分寫一些範例。

-V 檢查 Curl 版本
先檢查 curl版本,偶而在比較舊的版本中會有些bug或是不支援,老司機通常都是死在這種小細節上。

-V 參數(大寫v)
  1. $ curl -V
  2. curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.12
  3. Release-Date: 2022-01-05
  4. Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
  5. Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd
複製代碼



指令介紹
curl [options] [URL...]
-A/--user-agent <string> 設定使用者代理發送給伺服器
-b/--cookie <name=string/file> cookie字串或檔案讀取位置
-c/--cookie-jar <file> 操作結束後把cookie寫入到這個檔案中
-C/--continue-at <offset> 斷點續轉
-d/--data "data"攜帶 HTTP POST Data
-D/--dump-header <file> 把header資訊寫入到該檔案中
-e/--referer 來源網址
-f/--fail 連線失敗時不顯示http錯誤
-F/用來向主機上傳二進制文件,可以指定MIME 類型,也可以指定文件名
-H/--header 設定 request 裡所攜帶的 header
-i/--include 在 output 顯示 response 的 header
-k:指定跳过 SSL 檢測
-L:会让 HTTP 请求跟随服务器的重定向。curl 默认不跟随重定向
--limit-rate:用来限制 HTTP 请求和回应的带宽,模拟慢网速的环境
-o/--output 把輸出寫到該檔案中,等同於wget指令
-O/--remote-name 把輸出寫到該檔案中,保留遠端檔案的檔名
-r/--range <range> 檢索來自HTTP/1.1或FTP伺服器位元組範圍
--resolve HOST:PORT:ADDRESS  強制將 HOST:PORT 解析到指定的IP ADDRESS
-s/--silent 靜音模式。不輸出任何東西
-T/--upload-file <file> 上傳檔案
-u/--user <user[:password]> 設定伺服器的使用者和密碼
-v/--verbose 輸出更多的訊息方便 debug
-w/--write-out [format] 什麼輸出完成後
-x/--proxy <host[:port]> 在給定的埠上使用HTTP代理
-X/--request [GET|POST|PUT|DELETE|PATCH]  使用指定的 http method 來發出 http request
-#/--progress-bar 進度條顯示當前的傳送狀態



訪問網頁
第一步通是驗證訪問網站有無錯誤,首先使用的是 curl 不加上任何參數,先測試訪狀態再來檢查是否有任何問題。
要注意訪問指定port號時要確認http還是https是使用哪種。
執行 Curl 指令
  1. 執行 Curl 指令
  2. #訪問 HTTPS 網頁
  3. curl https://www.cjkuo.net

  4. #訪問 HTTPS 特殊 port
  5. curl https://www.cjkuo.net:8080/

  6. #訪問 HTTP 網頁
  7. curl http://www.cjkuo.net

  8. #訪問 HTTP 特殊 port
  9. curl http://www.cjkuo.net:8080/
複製代碼

-A 指定 User-Agent
網路安全不斷受到重視,會遇到某些網頁不給curl此類型的工具做連線,需要修改user-agent 來宣告改變瀏覽器,下方當執行指令時有指定時跟沒有指定時的執行差異比較。
當指定user-agent 是”Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36″時,會看到user-agent 從 curl/7.81.0 變成 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36。

-A 指令(指定user-agent)
  1. $ curl -v -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" https://google.com/
  2. ---省略----
  3. > GET / HTTP/2
  4. > Host: google.com
  5. > user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
  6. > accept: */*
  7. >
  8. * TLSv1---省略----
複製代碼

-A 指令(未指定user-agent)
  1. -A 指令(未指定user-agent)
  2. $ curl -v  https://google.com/
  3. ---省略----
  4. > GET / HTTP/2
  5. > Host: google.com
  6. > user-agent: curl/7.81.0
  7. > accept: */*
  8. >
  9. * TLSv1---省略----
複製代碼


c/-b 儲存及讀取Cookie
很多網站都會使用cookie 來做登入上的認證,或是訪問時辨認是否為正常的使用者此時就可以使用-c 來儲存 cookie ,-b來讀取 cookie。
-c 指令(儲存cookie)
  1. curl -c cookie_file https://www.google.com/
  2. #將請求時產生的 cookie 資訊儲存至cookie_file
複製代碼

-b 指令(讀取Cookie)
  1. curl -b cookie_file https://www.google.com/
  2. #發出請求時將 cookie_file 中的資訊帶入至請求中
複製代碼

有的時候需要同時讀取cookie 資訊及寫入cookie 資訊,這時就需要同時下兩個指令。
-b -c 指令同時使用
  1. curl -b cookie_file -c cookie_file https://www.google.com/
  2. #訪問時將 cookie_file 中的資訊帶入至請求中,並將完成後的cookie 資訊寫入 cookie_file 檔案中。
複製代碼


-e 帶入來源網址 referer
部分server為了要避免盜連問題會確認引用源是否來自同一個站,此時就要欺騙服務器的檢查機制來取得相關資源。

-e 使用指定的來源網址

  1. $ curl -v -e "www.facebook.com" https://google.com/
  2. ---- 省略 ----
  3. > GET / HTTP/2
  4. > Host: google.com
  5. > user-agent: curl/7.81.0
  6. > accept: */*
  7. > referer: www.facebook.com
  8. # 帶入訪問來源 "www.facebook.com"
  9. >
  10. ---- 省略 ----
複製代碼


-e 使用 auto 參數
  1. $ curl -L -v -e ";auto" https://google.com/
  2. ---- 省略 ----
  3. < HTTP/2 301
  4. < location: https://www.google.com/
  5. #server 回應跳轉
  6. ---- 省略 ----
  7. > GET / HTTP/2
  8. > Host: www.google.com
  9. > user-agent: curl/7.81.0
  10. > accept: */*
  11. > referer: https://google.com/
  12. #使用 auto 會自動帶-L 之前跳轉的頁面資訊
  13. ---- 省略 ----
複製代碼


-o/-O 下載檔案,-C中斷續載
透過下載檔案測試站點上傳速度、本地的下載速度或將網路資源保存在電腦中,可以使用-o 這個參數,但要注意執行時大小寫有不同。
小寫的-o 代表下載檔案並重新命名,下載風景圖的範例:
-o 指令(小寫o)
  1. curl -o city_bridge https://cdn.stocksnap.io/img-thumbs/960w/city-bridge_KSM9UIBTQ9.jpg
複製代碼

大寫的-O 代表下載檔案並使用原始圖檔的名稱(city-bridge_KSM9UIBTQ9.jpg),下載風景圖的範例:
-o 指令(大寫o)
  1. curl -O https://cdn.stocksnap.io/img-thumbs/960w/city-bridge_KSM9UIBTQ9.jpg
複製代碼

檔案下載到中斷時不用整個檔案重新下載,可利用-C 的指令重新續傳下載。
-C -o 指令(大寫o)
  1. curl -C -O https://cdn.stocksnap.io/img-thumbs/960w/city-bridge_KSM9UIBTQ9.jpg
複製代碼



limit-rate 限制傳輸速度
要測試下載是否正常又不想佔滿網路頻寬,需限制 curl 的資料傳輸速度,使用 –limit-rate 參數來指定傳輸速度的上限。
這裡使用 --limit-rate 參數所指定的傳輸速度上限值,可用的單位有 KB(K 或 k)、MB(M 或 m)、GB(G 或 g),例如 100k、10M、2G 等,但都是大約限速不會剛剛好的就卡死在某一個數字上喔。
--limit-rate 參數
  1. $curl --limit-rate 100k -O https://cdn.stocksnap.io/img-thumbs/960w/city-bridge_KSM9UIBTQ9.jpg
複製代碼



-L 跟隨跳轉
預設情形下 Curl 執行時不會跟隨301或302跳轉,遇到頁面會需要跳轉此功能請加上 -L,例如直接使用 curl 訪問 http://google.com/ 在下方範例就不會跳轉。
-L 參數
  1. cjk@cjk:~$ curl http://google.com/
  2. <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
  3. <TITLE>301 Moved</TITLE></HEAD><BODY>
  4. <H1>301 Moved</H1>
  5. The document has moved
  6. <A HREF="http://www.google.com/">here</A>.
  7. </BODY></HTML>
複製代碼




-i/-I 顯示 response 的 header
在做驗證的時候除了要看到網頁內容,更重要的是要知道連線中每個細節有甚麼不一樣。此時會多看 Server 回應的header及內容,來判別目前異常的現象或是瀏覽器行為。
大小寫的i在輸出內容有差異,最主要不會顯示網頁內容,除非必要不然在使用上我通常使用大I可以有減少輸出內容,來減少閱讀上的疲憊感。
-i 參數
  1. $ curl -i http://google.com/
  2. HTTP/1.1 301 Moved Permanently
  3. Location: http://www.google.com/
  4. Content-Type: text/html; charset=UTF-8
  5. Date: Sun, 17 Jul 2022 07:14:22 GMT
  6. Expires: Tue, 16 Aug 2022 07:14:22 GMT
  7. Cache-Control: public, max-age=2592000
  8. Server: gws
  9. Content-Length: 219
  10. X-XSS-Protection: 0
  11. X-Frame-Options: SAMEORIGIN

  12. <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
  13. <TITLE>301 Moved</TITLE></HEAD><BODY>
  14. <H1>301 Moved</H1>
  15. The document has moved
  16. <A HREF="http://www.google.com/">here</A>.
  17. </BODY></HTML>
複製代碼


-I 參數(大寫i)
  1. $ curl -I http://google.com/
  2. HTTP/1.1 301 Moved Permanently
  3. Location: http://www.google.com/
  4. Content-Type: text/html; charset=UTF-8
  5. Date: Sun, 17 Jul 2022 07:18:26 GMT
  6. Expires: Tue, 16 Aug 2022 07:18:26 GMT
  7. Cache-Control: public, max-age=2592000
  8. Server: gws
  9. Content-Length: 219
  10. X-XSS-Protection: 0
  11. X-Frame-Options: SAMEORIGIN
複製代碼



resolve 強制解析Host 為指定IP
需要針對某些網站或是主機做測試時都需要更改hosts檔案,可直接使用resolve參數來強制將host解析成需要的IP。
-- resolve (指定HOST解析IP)
  1. $ curl --resolve www.google.com:443:142.251.35.164 -v https://www.google.com
  2. * Added www.google.com:443:142.251.35.164 to DNS cache
  3. #將 www.google.com 解析為142.251.35.164 新增至 DNS 快取中
  4. * Hostname www.google.com was found in DNS cache
  5. #解析Hostname www.google.com 時有在DNS快取中找到,優先使用快取紀錄。
  6. *   Trying 142.251.35.164:443...
  7. * Connected to www.google.com (142.251.35.164) port 443 (#0)
複製代碼


-v 輸出完整訊息
-v 這個功能主要是用來除錯或完整顯示整個連線過程的內容,會包含 SSL 握手資訊及 request 裡所攜帶的 header。當使用-i/-I 這個參數已經無法判別,就使用-v看更詳細的輸出來理解過程中到底是段在哪裡排除。
另外有寫一篇利用-v 來判別錯誤發生在哪一個可能的範圍,請參考文章”[color=var(--ast-global-color-0)]Linux curl -v 快速判別無法訪問服務問題點在哪裡?“。

-v 指令完整輸出
  1. $ curl -v https://google.com/
  2. *   Trying 172.217.160.78:443...
  3. * Connected to google.com (172.217.160.78) port 443 (#0)
  4. * ALPN, offering h2
  5. * ALPN, offering http/1.1
  6. *  CAfile: /etc/ssl/certs/ca-certificates.crt
  7. *  CApath: /etc/ssl/certs
  8. * TLSv1.0 (OUT), TLS header, Certificate Status (22):
  9. * TLSv1.3 (OUT), TLS handshake, Client hello (1):
  10. * TLSv1.2 (IN), TLS header, Certificate Status (22):
  11. * TLSv1.3 (IN), TLS handshake, Server hello (2):
  12. * TLSv1.2 (IN), TLS header, Finished (20):
  13. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  14. * TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
  15. * TLSv1.3 (IN), TLS handshake, Certificate (11):
  16. * TLSv1.3 (IN), TLS handshake, CERT verify (15):
  17. * TLSv1.3 (IN), TLS handshake, Finished (20):
  18. * TLSv1.2 (OUT), TLS header, Finished (20):
  19. * TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
  20. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  21. * TLSv1.3 (OUT), TLS handshake, Finished (20):
  22. * SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
  23. * ALPN, server accepted to use h2
  24. * Server certificate:
  25. *  subject: CN=*.google.com
  26. *  start date: Jun 27 08:17:39 2022 GMT
  27. *  expire date: Sep 19 08:17:38 2022 GMT
  28. *  subjectAltName: host "google.com" matched cert's "google.com"
  29. *  issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3
  30. *  SSL certificate verify ok.
  31. * Using HTTP2, server supports multiplexing
  32. * Connection state changed (HTTP/2 confirmed)
  33. * Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
  34. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  35. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  36. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  37. * Using Stream ID: 1 (easy handle 0x55baeda86e80)
  38. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  39. > GET / HTTP/2
  40. > Host: google.com
  41. > user-agent: curl/7.81.0
  42. > accept: */*
  43. >
  44. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  45. * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  46. * TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
  47. * old SSL session ID is stale, removing
  48. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  49. * TLSv1.2 (OUT), TLS header, Supplemental data (23):
  50. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  51. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  52. < HTTP/2 301
  53. < location: https://www.google.com/
  54. < content-type: text/html; charset=UTF-8
  55. < date: Sun, 17 Jul 2022 07:26:16 GMT
  56. < expires: Tue, 16 Aug 2022 07:26:16 GMT
  57. < cache-control: public, max-age=2592000
  58. < server: gws
  59. < content-length: 220
  60. < x-xss-protection: 0
  61. < x-frame-options: SAMEORIGIN
  62. < alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
  63. <
  64. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  65. <HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
  66. <TITLE>301 Moved</TITLE></HEAD><BODY>
  67. <H1>301 Moved</H1>
  68. The document has moved
  69. <A HREF="https://www.google.com/">here</A>.
  70. </BODY></HTML>
  71. * TLSv1.2 (IN), TLS header, Supplemental data (23):
  72. * Connection #0 to host google.com left intact
複製代碼



文章出處
https://www.cjkuo.net/linux-curl-detail/

參考來源:


 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-10-9 17:39 , Processed in 0.090214 second(s), 26 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表