在Linux中curl是一個利用URL規則在命令行下工作的文件傳輸工具,可以說是一款很強大的http命令行工具。它支持文件的上傳和下載,是綜合傳輸工具,但按傳統,習慣稱url為下載工具。
語法:# curl [option] [url]
-A/--user-agent <string> 設置用戶代理發送給服務器 -b/--cookie <name=string/file> cookie字符串或文件讀取位置 -c/--cookie-jar <file> 操作結束后把cookie寫入到這個文件中 -C/--continue-at <offset> 斷點續轉 -D/--dump-header <file> 把header信息寫入到該文件中 -e/--referer 來源網址 -f/--fail 連接失敗時不顯示http錯誤 -o/--output 把輸出寫到該文件中 -O/--remote-name 把輸出寫到該文件中,保留遠程文件的文件名 -r/--range <range> 檢索來自HTTP/1.1或FTP服務器字節范圍 -s/--silent 靜音模式。不輸出任何東西 -T/--upload-file <file> 上傳文件 -u/--user <user[:password]> 設置服務器的用戶和密碼 -w/--write-out [format] 什么輸出完成后 -x/--proxy <host[:port]> 在給定的端口上使用HTTP代理 -#/--progress-bar 進度條顯示當前的傳送狀態
-a/--append 上傳文件時,附加到目標文件
--anyauth 可以使用“任何”身份驗證方法
--basic 使用HTTP基本驗證
-B/--use-ascii 使用ASCII文本傳輸
-d/--data <data> HTTP POST方式傳送數據
--data-ascii <data> 以ascii的方式post數據
--data-binary <data> 以二進制的方式post數據
--negotiate 使用HTTP身份驗證
--digest 使用數字身份驗證
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
--egd-file <file> 為隨機數據(SSL)設置EGD socket路徑
--tcp-nodelay 使用TCP_NODELAY選項
-E/--cert <cert[:passwd]> 客戶端證書文件和密碼 (SSL)
--cert-type <type> 證書文件類型 (DER/PEM/ENG) (SSL)
--key <key> 私鑰文件名 (SSL)
--key-type <type> 私鑰文件類型 (DER/PEM/ENG) (SSL)
--pass <pass> 私鑰密碼 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA證書 (SSL)
--capath <directory> CA目 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密碼
--compressed 要求返回是壓縮的形勢 (using deflate or gzip)
--connect-timeout <seconds> 設置最大請求時間
--create-dirs 建立本地目錄的目錄層次結構
--crlf 上傳是把LF轉變成CRLF
--ftp-create-dirs 如果遠程目錄不存在,創建遠程目錄
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的時候,忽略該IP地址
--ftp-ssl 嘗試用 SSL/TLS 來進行ftp數據傳輸
--ftp-ssl-reqd 要求用 SSL/TLS 來進行ftp數據傳輸
-F/--form <name=content> 模擬http表單提交數據
-form-string <name=string> 模擬http表單提交數據
-g/--globoff 禁用網址序列和范圍使用{}和[]
-G/--get 以get的方式來發送數據
-h/--help 幫助
-H/--header <line> 自定義頭信息傳遞給服務器
--ignore-content-length 忽略的HTTP頭信息的長度
-i/--include 輸出時包括protocol頭信息
-I/--head 只顯示文檔信息
-j/--junk-session-cookies 讀取文件時忽略session cookie
--interface <interface> 使用指定網絡接口/地址
--krb4 <level> 使用指定安全級別的krb4
-k/--insecure 允許不使用證書到SSL站點
-K/--config 指定的配置文件讀取
-l/--list-only 列出ftp目錄下的文件名稱
--limit-rate <rate> 設置傳輸速度
--local-port<NUM> 強制使用本地端口號
-m/--max-time <seconds> 設置最大傳輸時間
--max-redirs <num> 設置最大讀取的目錄數
--max-filesize <bytes> 設置最大下載的文件總量
-M/--manual 顯示全手動
-n/--netrc 從netrc文件中讀取用戶名和密碼
--netrc-optional 使用 .netrc 或者 URL來覆蓋-n
--ntlm 使用 HTTP NTLM 身份驗證
-N/--no-buffer 禁用緩沖輸出
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 選擇任一代理身份驗證方法
--proxy-basic 在代理上使用基本身份驗證
--proxy-digest 在代理上使用數字身份驗證
--proxy-ntlm 在代理上使用ntlm身份驗證
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-Q/--quote <cmd> 文件傳輸前,發送命令到服務器
--range-file 讀取(SSL)的隨機文件
-R/--remote-time 在本地生成文件時,保留遠程文件時間
--retry <num> 傳輸出現問題時,重試的次數
--retry-delay <seconds> 傳輸出現問題時,設置重試間隔時間
--retry-max-time <seconds> 傳輸出現問題時,設置最大重試時間
-S/--show-error 顯示錯誤
--socks4 <host[:port]> 用socks4代理給定主機和端口
--socks5 <host[:port]> 用socks5代理給定主機和端口
-t/--telnet-option <OPT=val> Telnet選項設置
--trace <file> 對指定文件進行debug
--trace-ascii <file> Like --跟蹤但沒有hex輸出
--trace-time 跟蹤/詳細輸出時,添加時間戳
--url <URL> Spet URL to work with
-U/--proxy-user <user[:password]> 設置代理用戶名和密碼
-V/--version 顯示版本信息
-X/--request <command> 指定什么命令
-y/--speed-time 放棄限速所要的時間。默認為30
-Y/--speed-limit 停止傳輸速度的限制,速度時間'秒
-z/--time-cond 傳送時間設置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,進行第三方傳送
--3p-user 使用用戶名和密碼,進行第三方傳送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6
| -M/--manual | 顯示全手動 |
| -n/--netrc | 從netrc文件中讀取用戶名和密碼 |
| --netrc-optional | 使用 .netrc 或者 URL來覆蓋-n |
| --ntlm | 使用 HTTP NTLM 身份驗證 |
| -N/--no-buffer | 禁用緩沖輸出 |
| -o/--output | 把輸出寫到該文件中 |
| -O/--remote-name | 把輸出寫到該文件中,保留遠程文件的文件名 |
| -p/--proxytunnel | 使用HTTP代理 |
| --proxy-anyauth | 選擇任一代理身份驗證方法 |
| --proxy-basic | 在代理上使用基本身份驗證 |
| --proxy-digest | 在代理上使用數字身份驗證 |
| --proxy-ntlm | 在代理上使用ntlm身份驗證 |
| -P/--ftp-port <address> | 使用端口地址,而不是使用PASV |
| -Q/--quote <cmd> | 文件傳輸前,發送命令到服務器 |
| -r/--range <range> | 檢索來自HTTP/1.1或FTP服務器字節范圍 |
| --range-file | 讀取(SSL)的隨機文件 |
| -R/--remote-time | 在本地生成文件時,保留遠程文件時間 |
| --retry <num> | 傳輸出現問題時,重試的次數 |
| --retry-delay <seconds> | 傳輸出現問題時,設置重試間隔時間 |
| --retry-max-time <seconds> | 傳輸出現問題時,設置最大重試時間 |
| -s/--silent | 靜音模式。不輸出任何東西 |
| -S/--show-error | 顯示錯誤 |
| --socks4 <host[:port]> | 用socks4代理給定主機和端口 |
| --socks5 <host[:port]> | 用socks5代理給定主機和端口 |
| -t/--telnet-option <OPT=val> | Telnet選項設置 |
| --trace <file> | 對指定文件進行debug |
| --trace-ascii <file> Like | 跟蹤但沒有hex輸出 |
| --trace-time | 跟蹤/詳細輸出時,添加時間戳 |
| -T/--upload-file <file> | 上傳文件 |
| --url <URL> | Spet URL to work with |
| -u/--user <user[:password]> | 設置服務器的用戶和密碼 |
| -U/--proxy-user <user[:password]> | 設置代理用戶名和密碼 |
| -V/--version | 顯示版本信息 |
| -w/--write-out [format] | 什么輸出完成后 |
| -x/--proxy <host[:port]> | 在給定的端口上使用HTTP代理 |
| -X/--request <command> | 指定什么命令 |
| -y/--speed-time | 放棄限速所要的時間。默認為30 |
| -Y/--speed-limit | 停止傳輸速度的限制,速度時間'秒 |
| -z/--time-cond | 傳送時間設置 |
| -0/--http1.0 | 使用HTTP 1.0 |
| -1/--tlsv1 | 使用TLSv1(SSL) |
| -2/--sslv2 | 使用SSLv2的(SSL) |
| -3/--sslv3 | 使用的SSLv3(SSL) |
| --3p-quote | like -Q for the source URL for 3rd party transfer |
| --3p-url | 使用url,進行第三方傳送 |
| --3p-user | 使用用戶名和密碼,進行第三方傳送 |
| -4/--ipv4 | 使用IP4 |
| -6/--ipv6 | 使用IP6 |
| -#/--progress-bar | 用進度條顯示當前的傳送狀態 |
基本用法
例子:
1.測試是否可以達到一個網站,可用於client建立tcp連接或其他連接時候的測試排查網址是否可達
curl http://www.baidu.com
執行后,www.linux.com 的html就會顯示在屏幕上了
Ps:由於安裝linux的時候很多時候是沒有安裝桌面的,也意味着沒有瀏覽器,因此這個方法也經常用於測試一台服務器是否可以到達一個網站

不可達則則返回結果為空
![]()
2.保存訪問的網頁
2.1:使用linux的重定向功能保存
curl http://www.linux.com >> linux.html
執行完成后會顯示如下界面,顯示100%則表示保存成功,0則表示為沒有保存內容


2.2:可以使用curl的內置option:-o(小寫)保存網頁,此時頁面內容就會存儲到home.html的文件中
curl -o home.html http://www.sina.com.cn
結果和上面一樣
2.3,用-O(大寫的),后面的url要具體到某個文件,不然抓不下來。我們還可以用正則來抓取東西
curl -O http://www.linux.com/hello.sh
3.測試網頁返回值
# curl -o /dev/null -s -w %{http_code} www.linux.com
Ps:在腳本中,這是很常見的測試網站是否正常的用法
4.指定proxy服務器以及其端口
很多時候上網需要用到代理服務器(比如是使用代理服務器上網或者因為使用curl別人網站而被別人屏蔽IP地址的時候),幸運的是curl通過使用內置option:-x來支持設置代理
curl -x 192.168.100.100:1080 http://www.linux.com
curl -i -X POST '{https://1662d8sji1.execute-api.eu-central-1.amazonaws.com/v1/3,"si":"c2826469a40b"}'
5.cookie
有些網站是使用cookie來記錄session信息。對於chrome這樣的瀏覽器,可以輕易處理cookie信息,但在curl中只要增加相關參數也是可以很容易的處理cookie
5.1:保存http的response里面的cookie信息。內置option:-c(小寫)
curl -c cookiec.txt http://www.linux.com
執行后cookie信息就被存到了cookiec.txt里面了
模擬表單信息,模擬登錄,保存cookie信息
curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php
5.2:保存http的response里面的header信息。內置option: -D
curl -D cookied.txt http://www.linux.com
curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php
執行后cookie信息就被存到了cookied.txt里面了
注意:-c(小寫)產生的cookie和-D里面的cookie是不一樣的。
5.3:使用cookie
很多網站都是通過監視你的cookie信息來判斷你是否按規矩訪問他們的網站的,因此我們需要使用保存的cookie信息。內置option: -b
curl -b cookiec.txt http://www.linux.com
6.模仿瀏覽器
curl -A "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)" http://www.linux.com
這樣服務器端就會認為是使用IE8.0去訪問的
7.偽造referer(盜鏈)
很多服務器會檢查http訪問的referer從而來控制訪問。比如:你是先訪問首頁,然后再訪問首頁中的郵箱頁面,這里訪問郵箱的referer地址就是訪問首頁成功后的頁面地址,如果服務器發現對郵箱頁面訪問的referer地址不是首頁的地址,就斷定那是個盜連了
curl中內置option:-e可以讓我們設定referer
curl -e "www.linux.com" http://mail.linux.com
這樣就會讓服務器其以為你是從www.linux.com點擊某個鏈接過來的
這邊做一個小科普:referer盜鏈知識:
referer 是 HTTP 請求 header 的一部分,當瀏覽器(或者模擬瀏覽器行為)向web服務器發送請求的時候,頭信息里有包含referer 。比如我在www.baidu.com 鏈接去訪問google,那么點擊這個www.baidu.com ,它的header 信息里就有:
Referer=http://www.baidu.com

同理訪問sina也是,這邊都不屬於盜鏈情況,因為返回回來的還是baidu的頁面

盜鏈:就是一個網站中如果沒有起頁面中所說的信息,例如圖片信息,那么它完全可以將這個圖片的連接到別的網站。這樣沒有任何資源的網站利用了別的網站的資源來展示給瀏覽者,提高了自己的訪問量,而大部分瀏覽者又不會很容易地發現,這樣顯然,對於那個被利用了資源的網站是不公平的。一些不良網站為了不增加成本而擴充自己站點內容,經常盜用其他網站的鏈接。一方面損害了被鏈接網站的合法利益,另一方面又加重了被鏈接網站的服務器的負擔。
所以只要判斷當前的refer的上一頁是之前的主頁就可以斷定不是盜鏈。
8.下載文件
8.1:利用curl下載文件。
#使用內置option:-o(小寫)
curl -o dodo1.jpg http:www.linux.com/dodo1.JPG
#使用內置option:-O(大寫)
curl -O http://www.linux.com/dodo1.JPG
這樣就會以服務器上的名稱保存文件到本地
8.2:循環下載
有時候下載圖片可以能是前面的部分名稱是一樣的,就最后的尾綴名不一樣
curl -O http://www.linux.com/dodo[1-5].JPG
這樣就會把dodo1,dodo2,dodo3,dodo4,dodo5全部保存下來
8.3:下載重命名
curl -O http://www.linux.com/{hello,bb}/dodo[1-5].JPG
由於下載的hello與bb中的文件名都是dodo1,dodo2,dodo3,dodo4,dodo5。因此第二次下載的會把第一次下載的覆蓋,這樣就需要對文件進行重命名。
curl -o #1_#2.JPG http://www.linux.com/{hello,bb}/dodo[1-5].JPG
這樣在hello/dodo1.JPG的文件下載下來就會變成hello_dodo1.JPG,其他文件依此類推,從而有效的避免了文件被覆蓋
8.4:分塊下載
有時候下載的東西會比較大,這個時候我們可以分段下載。使用內置option:-r
curl -r 0-100 -o dodo1_part1.JPG http://www.linux.com/dodo1.JPG curl -r 100-200 -o dodo1_part2.JPG http://www.linux.com/dodo1.JPG curl -r 200- -o dodo1_part3.JPG http://www.linux.com/dodo1.JPG cat dodo1_part* > dodo1.JPG
這樣就可以查看dodo1.JPG的內容了
8.5:通過ftp下載文件
curl可以通過ftp下載文件,curl提供兩種從ftp中下載的語法
curl -O -u 用戶名:密碼 ftp://www.linux.com/dodo1.JPG curl -O ftp://用戶名:密碼@www.linux.com/dodo1.JPG
8.6:顯示下載進度條
curl -# -O http://www.linux.com/dodo1.JPG
8.7:不會顯示下載進度信息
curl -s -O http://www.linux.com/dodo1.JPG
9.斷點續傳
在windows中,我們可以使用迅雷這樣的軟件進行斷點續傳。curl可以通過內置option:-C同樣可以達到相同的效果
如果在下載dodo1.JPG的過程中突然掉線了,可以使用以下的方式續傳
curl -C -O http://www.linux.com/dodo1.JPG
10.上傳文件
curl不僅僅可以下載文件,還可以上傳文件。通過內置option:-T來實現
curl -T dodo1.JPG -u 用戶名:密碼 ftp://www.linux.com/img/
這樣就向ftp服務器上傳了文件dodo1.JPG
11.顯示抓取錯誤
curl -f http://www.linux.com/error
1. 獲取頁面內容
2. 顯示 HTTP 頭
3. 將鏈接保存到文件
4. 同時下載多個文件
5. 使用 -L 跟隨鏈接重定向
6. 使用 -A 自定義 User-Agent
7. 使用 -H 自定義 header
8. 使用 -c 保存 Cookie
9. 使用 -b 讀取 Cookie
10. 使用 -d 發送 POST 請求
1. 獲取頁面內容
當我們不加任何選項使用 curl 時,默認會發送 GET 請求來獲取鏈接內容到標准輸出。
curl http://www.codebelief.com
2. 顯示 HTTP 頭
如果我們只想要顯示 HTTP 頭,而不顯示文件內容,可以使用 -I 選項:
curl -I http://www.codebelief.com
輸出為:
HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Thu, 11 May 2017 08:24:45 GMT Content-Type: text/html; charset=utf-8 Content-Length: 24206 Connection: keep-alive X-Powered-By: Express Cache-Control: public, max-age=0 ETag: W/"5e8e-Yw5ZdnVVly9/aEnMX7fVXQ" Vary: Accept-Encoding
也可以同時顯示 HTTP 頭和文件內容,使用 -i 選項:
curl -i http://www.codebelief.com
輸出為:
HTTP/1.1 200 OK Server: nginx/1.10.3 Date: Thu, 11 May 2017 08:25:46 GMT Content-Type: text/html; charset=utf-8 Content-Length: 24206 Connection: keep-alive X-Powered-By: Express Cache-Control: public, max-age=0 ETag: W/"5e8e-Yw5ZdnVVly9/aEnMX7fVXQ" Vary: Accept-Encoding <!DOCTYPE html> <html lang="en"> ...... </html>
3. 將鏈接保存到文件
我們可以使用 > 符號將輸出重定向到本地文件中。
curl http://www.codebelief.com > index.html
也可以通過 curl 自帶的 -o/-O 選項將內容保存到文件中。
-o(小寫的 o):結果會被保存到命令行中提供的文件名
-O(大寫的 O):URL 中的文件名會被用作保存輸出的文件名
curl -o index.html http://www.codebelief.com
curl -O http://www.codebelief.com/page/2/
注意:使用 -O 選項時,必須確保鏈接末尾包含文件名,否則 curl 無法正確保存文件。如果遇到鏈接中無文件名的情況,應該使用 -o 選項手動指定文件名,或使用重定向符號。
4. 同時下載多個文件
我們可以使用 -o 或 -O 選項來同時指定多個鏈接,按照以下格式編寫命令:
curl -O http://www.codebelief.com/page/2/ -O http://www.codebelief.com/page/3/
或者:
curl -o page1.html http://www.codebelief.com/page/1/ -o page2.html http://www.codebelief.com/page/2/
5. 使用 -L 跟隨鏈接重定向
如果直接使用 curl 打開某些被重定向后的鏈接,這種情況下就無法獲取我們想要的網頁內容。例如:
curl http://codebelief.com
會得到如下提示:
<html> <head><title>301 Moved Permanently</title></head> <body bgcolor="white"> <center><h1>301 Moved Permanently</h1></center> <hr><center>nginx/1.10.3</center> </body> </html>
而當我們通過瀏覽器打開該鏈接時,會自動跳轉到 http://www.codebelief.com。此時我們想要 curl 做的,就是像瀏覽器一樣跟隨鏈接的跳轉,獲取最終的網頁內容。我們可以在命令中添加 -L 選項來跟隨鏈接重定向:
curl -L http://codebelief.com
這樣我們就能獲取到經過重定向后的網頁內容了。
6. 使用 -A 自定義 User-Agent
我們可以使用 -A 來自定義用戶代理,例如下面的命令將偽裝成安卓火狐瀏覽器對網頁進行請求:
curl -A “Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0” http://www.baidu.com
下面我們會使用 -H 來實現同樣的目的。
7. 使用 -H 自定義 header
當我們需要傳遞特定的 header 的時候,可以仿照以下命令來寫:
curl -H “Referer: www.example.com” -H “User-Agent: Custom-User-Agent” http://www.baidu.com
可以看到,當我們使用 -H 來自定義 User-Agent 時,需要使用 “User-Agent: xxx” 的格式。
我們能夠直接在 header 中傳遞 Cookie,格式與上面的例子一樣:
curl -H “Cookie: JSESSIONID=D0112A5063D938586B659EF8F939BE24” http://www.example.com
另一種方式會在下面介紹。
8. 使用 -c 保存 Cookie
當我們使用 cURL 訪問頁面的時候,默認是不會保存 Cookie 的。有些情況下我們希望保存 Cookie 以便下次訪問時使用。例如登陸了某個網站,我們希望再次訪問該網站時保持登陸的狀態,這時就可以現將登陸時的 Cookie 保存起來,下次訪問時再讀取。
-c 后面跟上要保存的文件名。
curl -c “cookie-example” http://www.example.com
9. 使用 -b 讀取 Cookie
前面講到了使用 -H 來發送 Cookie 的方法,這種方式是直接將 Cookie 字符串寫在命令中。如果使用 -b 來自定義 Cookie,命令如下:
curl -b “JSESSIONID=D0112A5063D938586B659EF8F939BE24” http://www.example.com
如果要從文件中讀取 Cookie,-H 就無能為力了,此時可以使用 -b 來達到這一目的:
curl -b “cookie-example” http://www.example.com
即 -b 后面既可以是 Cookie 字符串,也可以是保存了 Cookie 的文件名。
10. 使用 -d 發送 POST 請求
我們以登陸網頁為例來進行說明使用 cURL 發送 POST 請求的方法。假設有一個登錄頁面 www.example.com/login,只需要提交用戶名和密碼便可登錄。我們可以使用 cURL 來完成這一 POST 請求,-d 用於指定發送的數據,-X 用於指定發送數據的方式:
curl -d “userName=tom&passwd=123456” -X POST http://www.example.com/login
在使用 -d 的情況下,如果省略 -X,則默認為 POST 方式:
curl -d “userName=tom&passwd=123456” http://www.example.com/login
強制使用 GET 方式
發送數據時,不僅可以使用 POST 方式,也可以使用 GET 方式,例如:
curl -d “somedata” -X GET http://www.example.com/api
或者使用 -G 選項:
curl -d “somedata” -G http://www.example.com/api
從文件中讀取 data
curl -d “@data.txt” http://www.example.com/login
帶 Cookie 登錄
當然,如果我們再次訪問該網站,仍然會變成未登錄的狀態。我們可以用之前提到的方法保存 Cookie,在每次訪問網站時都帶上該 Cookie 以保持登錄狀態。
curl -c “cookie-login” -d “userName=tom&passwd=123456” http://www.example.com/login
再次訪問該網站時,使用以下命令:
curl -b “cookie-login” http://www.example.com/login
這樣,就能保持訪問的是登錄后的頁面了。
參考鏈接:
https://blog.csdn.net/cuishi0/article/details/7038999
https://blog.csdn.net/chenliaoyuanjv/article/details/79689028
