最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux之curl命令的使用及說明

 更新時間:2025年11月11日 11:42:56   作者:fengyehongWorld  
本文詳細介紹了如何使用curl命令行工具進行各種HTTP請求,包括GET、POST、文件上傳等操作,同時,也講述了curl的常用參數(shù)和選項,如請求方式、數(shù)據(jù)提交方式、頭部信息、輸出控制等,此外,還探討了提交數(shù)據(jù)的常見格式,如URL參數(shù)、表單提交、JSON和XML數(shù)據(jù)等

一. 前期準備

1.1 curl命令簡介

curl 是一個強大的命令行工具,用于向服務器發(fā)送請求并獲取數(shù)據(jù)。

它支持多種協(xié)議(如 HTTP、HTTPS、FTP、SFTP 等),常用于接口測試、下載文件、提交表單等操作。

命令行參數(shù)多達幾十種。如果熟練的話,完全可以取代 Postman 這一類的圖形界面工具。

除了curl命令之外,類似的還有HTTPie命令。

  • 官網(wǎng):https://httpie.io
  • Github:https://github.com/httpie/cli
項目curlHTTPie
命令名curlhttp
默認預裝? Linux 預裝? 需手動安裝
所屬語言C 編寫(高性能)Python 編寫(易擴展)
依賴情況幾乎無依賴依賴 Python 環(huán)境
支持協(xié)議HTTP, HTTPS, FTP, SFTP, SCP, SMTP 等僅支持 HTTP 和 HTTPS

1.2 環(huán)境準備

截止到2025年7月31日,curl的最新版本為8.15.0,由于linux系統(tǒng)預裝的并不是最新版本的curl命令,此處介紹下載curl源碼的方式,編譯安裝。筆者使用的是如下版本的Ubuntu系統(tǒng)。

apluser@FengYeHong-HP:work$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.1 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

1.2.1 安裝源碼編譯依賴庫

sudo apt update
sudo apt install -y build-essential libssl-dev libnghttp2-dev libz-dev libidn2-dev libpsl-dev
庫名作用用途
build-essential安裝構建 C/C++ 程序所需的基礎工具,
包含了 gcc, g++, make 以及其他常用構建工具。
幾乎所有需要編譯源代碼的軟件都會依賴它。
libssl-devOpenSSL 的開發(fā)庫。支持使用 HTTPS, TLS/SSL 等安全協(xié)議的程序開發(fā),
比如 curl、wget、openssl 自己等。
libnghttp2-devHTTP/2 協(xié)議支持庫的開發(fā)包。為支持 HTTP/2 的網(wǎng)絡程序提供功能,
如新版 curl、nginx、httpie 等。
libz-devzlib 的開發(fā)包(壓縮庫)。支持 gzip/deflate 等壓縮算法,
是許多程序處理壓縮數(shù)據(jù)(如 HTTP 請求)時所需的庫。
libidn2-dev用于國際化域名(IDN)的解析(支持非 ASCII 域名)。使網(wǎng)絡工具能識別形如 https://你好.中國 這種 URL。
libpsl-devPublic Suffix List 的開發(fā)包。在處理域名時幫助判斷頂級域(如 .com.cn 是一個后綴),用于 cookie 安全處理等。

1.2.2 下載并編譯安裝最新的curl

下載最新的curl安裝包

  • 最新的版本號,去curl的官網(wǎng)獲取
echo "8.15.0" | xargs -I {} curl -LO https://curl.se/download/curl-{}.tar.gz
tar -xzf curl-8.7.1.tar.gz
cd curl-8.7.1
./configure --with-ssl
make -j$(nproc)
sudo make install

1.2.3 版本確認

編譯安裝之后,確認curl命令的最新版本,然而此時的版本顯示為舊版本

apluser@FengYeHong-HP:curl-8.15.0$ curl --version
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.13
Release-Date: 2022-01-05
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
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
apluser@FengYeHong-HP:curl-8.15.0$

編譯安裝的 curl 默認路徑是 /usr/local/bin/curl,可能和系統(tǒng)原本/usr/bin/curl沖突,你可以通過以下方式優(yōu)先使用新的版本

# 清除舊路徑緩存
apluser@FengYeHong-HP:curl-8.15.0$ hash -r
# 查看curl命令的最新路徑
apluser@FengYeHong-HP:curl-8.15.0$ which curl
/usr/local/bin/curl

再次確認curl版本,會發(fā)現(xiàn)提示報錯,出現(xiàn)此錯誤的原因是

  • curl 可執(zhí)行文件在運行時找不到(或找到了錯誤版本的)共享庫(libcurl) 中的 curl_easy_header 符號
  • 該函數(shù)是從 libcurl 8.x 開始才引入的,而你現(xiàn)在的環(huán)境可能仍然鏈接到了舊版的 libcurl.so.4(來自 7.x)
apluser@FengYeHong-HP:curl-8.15.0$ curl --version
curl: symbol lookup error: curl: undefined symbol: curl_easy_header
apluser@FengYeHong-HP:curl-8.15.0$

1.2.4 添加動態(tài)庫鏈接路徑

確保系統(tǒng)永久識別新版本 libcurl

# 1. 確認新版本 libcurl 已安裝到 /usr/local/lib
ls /usr/local/lib | grep libcurl
# 2. 添加 /usr/local/lib 到動態(tài)庫搜索路徑
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/local-curl.conf
# 3. 讓系統(tǒng)重新加載動態(tài)鏈接器緩存
sudo ldconfig

然后就可以發(fā)現(xiàn),curl的版本為最新的了

apluser@FengYeHong-HP:~$ which curl
/usr/local/bin/curl
apluser@FengYeHong-HP:~$ curl --version
curl 8.15.0 (x86_64-pc-linux-gnu) libcurl/8.15.0 OpenSSL/3.0.2 zlib/1.2.11 libidn2/2.3.2 libpsl/0.21.0 nghttp2/1.43.0
Release-Date: 2025-07-16
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp ws wss
Features: alt-svc AsynchDNS HSTS HTTP2 HTTPS-proxy IDN IPv6 Largefile libz NTLM PSL SSL threadsafe TLS-SRP UnixSockets

1.3 Springboot接口準備

1.3.1 get接口

@GetMapping("/get")
@ResponseBody
public ResponseEntity<Map> getCurl(
        @RequestParam(value = "JobId", required = false) String jobId
        , @RequestParam(value = "INFILE", required = false) String inFilePath
        , @RequestParam(value = "OTFILE", required = false) String outFilePath
        , @RequestParam(value = "name", required = false) String name
) {

    Map<Object, Object> map = new HashMap<>() {{
        put("id", 110120);
        put("name", "楓葉紅");
    }};
    return ResponseEntity.ok(map);
}

1.3.2 Post接口

1.3.2.1 from
@Data
public class Test36Form {

    private String order_id;
    private String event;
}

@PostMapping("/form/post")
public ResponseEntity<Map<String, String>> formPostCurl(Test36Form curlForm) {

     System.out.println(curlForm);

     Map<String, String> map = new HashMap<>() {{
         put("type", "form請求");
         put("result", "成功");
     }};
     return ResponseEntity.ok(map);
 }
1.3.2.2 json
@PostMapping("/json/post")
public ResponseEntity<Map<String, String>> jsonPostCurl(
        @RequestHeader(value = "X-TOKEN", required = false) String xToken,
        @RequestBody Map<String, Object> mapData
) {

    System.out.println(mapData);
    System.out.println("接收到的token請求頭為: " + xToken);

    Map<String, String> map = new HashMap<>() {{
        put("type", "json請求");
        put("result", "成功");
    }};
    return ResponseEntity.ok(map);
}

1.3.3 文件上傳

1.3.3.1 表單提交
@PostMapping("/file/upload")
public ResponseEntity<Map<String, String>> fileUploadCurl(MultipartHttpServletRequest request) {

    // 獲取curl命令上傳的文件
    MultiValueMap<String, MultipartFile> multiFileMap = request.getMultiFileMap();
    List<MultipartFile> file1 = multiFileMap.get("file1");
    // 獲取上傳的文件名稱
    System.out.println(file1.get(0).getOriginalFilename());

    // 獲取curl文提交的數(shù)據(jù)
    Map<String, String[]> parameterMap = request.getParameterMap();

    String[] params1 = parameterMap.get("jsonData1");
    System.out.println(Arrays.toString(params1));

    String[] params2 = parameterMap.get("jsonData2");
    System.out.println(Arrays.toString(params2));

    Map<String, String> map = new HashMap<>() {{
        put("type", "文件上傳請求");
        put("result", "成功");
    }};
    return ResponseEntity.ok(map);
}
1.3.3.2 Put文件上傳
@PutMapping("/put/file")
public ResponseEntity<Map<String, String>> putFile(HttpServletRequest request) throws IOException {

    // 獲取請求頭中的包含的上傳文件名稱
    String fileName = request.getHeader("X-Filename");
    System.out.println("上傳的文件名稱為: " + fileName);
    
    // 獲取上傳的文件輸入流
    InputStream inputStream = request.getInputStream();

    // 文件保存
    Path filePath = Paths.get(fileName);
    Files.copy(inputStream, filePath, StandardCopyOption.REPLACE_EXISTING);

    Map<String, String> map = new HashMap<>() {{
        put("type", "文件上傳請求");
        put("result", "成功");
    }};
    return ResponseEntity.ok(map);
}

二. 常用參數(shù)

2.1 請求方式相關

2.1.1-G⇔--get發(fā)送Get請求

發(fā)送Get請求

apluser@FengYeHong-HP:~$ curl -G -w '\n' 'http://192.168.3.24:9002/curl/get'
{"name":"楓葉紅","id":110120}
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ curl --get -w '\n' 'http://192.168.3.24:9002/curl/get'
{"name":"楓葉紅","id":110120}
apluser@FengYeHong-HP:~$
apluser@FengYeHong-HP:~$ curl -X GET -w '\n' 'http://192.168.3.24:9002/curl/get'
{"name":"楓葉紅","id":110120}

2.1.2-X⇔--request指定http請求方式

發(fā)送Get請求

apluser@FengYeHong-HP:~$ curl -X GET -w '\n' 'http://192.168.3.24:9002/curl/get'
{"name":"楓葉紅","id":110120}

發(fā)送Post請求

  • -w '\n':為了讓curl文和返回的json中間有個空行
  • --header 'Content-Type: application/json':聲明發(fā)送的json數(shù)據(jù)
apluser@FengYeHong-HP:~$ echo;curl -X POST -w '\n' \
--header 'Content-Type: application/json' \
--data-binary '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'

{"result":"成功","type":"json請求"}

由于提交的是json數(shù)據(jù),curl會自動推測是出post命令,-X POST可以省略

  • 注意:由于json協(xié)議默認就是UTF-8,因此不需要通過charset特別指定編碼
apluser@FengYeHong-HP:~$ curl -v -w '\n' \
--header 'Content-Type: application/json' \
--data-binary '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'
*   Trying 192.168.3.24:9002...
* Connected to 192.168.3.24 (192.168.3.24) port 9002
* using HTTP/1.x
> POST /curl/json/post HTTP/1.1
> Host: 192.168.3.24:9002
> User-Agent: curl/8.15.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 24
>
* upload completely sent off: 24 bytes
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Fri, 01 Aug 2025 23:42:29 GMT
<
* Connection #0 to host 192.168.3.24 left intact
{"result":"成功","type":"json請求"}

2.2 數(shù)據(jù)提交方式相關

2.2.1-d⇔--data和--data-binary

選項全稱特點
-d--data默認以 application/x-www-form-urlencoded 發(fā)送;可多次使用
--data--data等同于 -d,更長的寫法
--data-binary--data-binary不會處理數(shù)據(jù)(如不轉義換行等);適用于發(fā)送原始二進制,JSON,XML數(shù)據(jù)

-d / --data

  • 會對傳入的數(shù)據(jù)進行 URL 編碼處理,如果沒有手動指定 Content-Type: application/json,它會自動使用 application/x-www-form-urlencoded
  • 若傳入多段數(shù)據(jù),會自動合并為一個 POST 請求體
  • 除非顯式指定其他方法,否則會把請求方法改為 POST,因此如果使用了-d / --data的話,-X POST 可省略

--data-binary

  • 不會對數(shù)據(jù)進行任何處理(保持原樣發(fā)送,包括換行符、空格等)。
  • 更適合用于發(fā)送 JSON、XML、文件內容等原始結構。
  • 也會把請求方法改為 POST,但不會對你輸入的數(shù)據(jù)進行預處理。
# ?-d
curl -v -w '\n' \
--header 'Content-Type: application/json' \
-d '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'

# ?--data
curl -v -w '\n' \
--header 'Content-Type: application/json' \
--data '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'

# ?--data-binary
curl -v -w '\n' \
--header 'Content-Type: application/json' \
--data-binary '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'
  • 以上三種請求,得到的結果均如下圖所示

但如果省略了--header 'Content-Type: application/json'的請求頭之后,使用-d / --data的話,就會默認以 application/x-www-form-urlencoded的表單方式提交數(shù)據(jù)。

curl -v -w '\n' \
--data 'order_id=order134' \
--data 'event=PLACED' \
'http://192.168.3.24:9002/curl/form/post'
  • 效果如下圖所示

2.2.2--json

2022年的7.82.0版本的curl追加了--json配置項,專門用來發(fā)送json數(shù)據(jù)。

  • 7.82.0版本的之前的curl必須指定Content-Type: application/json的head才能使用。
curl -v -w '\n' \
--header 'Content-Type: application/json' \
--data-binary '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'
  • 7.82.0版本的之后的curl,直接使用--json配置項即可發(fā)送json數(shù)據(jù)。
curl -v -w '\n' \
--json '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'

  • 支持流的方式使用json數(shù)據(jù)
apluser@FengYeHong-HP:~$ echo '{"product_id": 20.5}' | \
curl -w '\n' \
--json @- \
--location 'http://192.168.3.24:9002/curl/json/post'
{"result":"成功","type":"json請求"}
  • 支持文件的方式使用json數(shù)據(jù)
apluser@FengYeHong-HP:work$ cat file.json
{"product_id": 20.5, "name": "楓葉紅"}
apluser@FengYeHong-HP:work$
apluser@FengYeHong-HP:work$ curl -w '\n' \
--json @file.json \
--location 'http://192.168.3.24:9002/curl/json/post'
{"result":"成功","type":"json請求"}

2.2.3-F⇔--form

-F--form 表示使用 multipart/form-data 類型的表單提交數(shù)據(jù)

  • 用于上傳文件
  • 用于上傳文件的同時,提交json數(shù)據(jù)等
  • -F-d 不能同時使用
curl -v -w '\n' \
--form 'file1=@grep_cmd.txt' \
'http://192.168.3.24:9002/curl/file/upload'

上傳文件的同時提交json數(shù)據(jù)

curl -v -w '\n' \
--form 'file1=@grep_cmd.txt' \
--form 'jsonData1={"name":"wangwu","age":30,"card":["abc","bbc"]}' \
--form 'jsonData1=測試信息' \
--form 'jsonData1=["名字","年齡","住址"]' \
--form 'jsonData2={"name":"zhaoliu","age":20}' \
'http://192.168.3.24:9002/curl/file/upload'

2.2.4--data和--data-urlencode和--url-query

--data--data-urlencode

  • -d / --data 會對傳入的數(shù)據(jù)進行 URL 編碼處理,默認會自動使用 application/x-www-form-urlencoded表單的Post請求
  • 而我們需要發(fā)送Get請求,并且需要通過url傳遞參數(shù),因此需要明確的通過--get配置項指定Get的請求方式
  • 當url中有漢字等字符時,使用--data-urlencode配置項進行編碼
curl --get -v -w '\n' \
-d 'INFILE=/data/path/out' \
--data 'JobId=CCMPLTEST01' \
--data 'OTFILE=/data/path/in' \
--data-urlencode 'name=賈 飛天' \
'http://192.168.3.24:9002/curl/get'

--url-query

  • 2022年的7.87.0版本的curl追加了--url-query配置項,專門用來處理url傳參
  • 使用--url-query配置項之后,使用Get請求時,就不用專門聲明使用Get請求了
  • Post,Put,Delete方式也支持使用 --url-query
curl -v -w '\n' \
--url-query 'JobId=CCMPLTEST01' \
--url-query 'OTFILE=/data/path/in' \
--url-query 'INFILE=/data/path/out' \
--url-query 'name=賈 飛天' \
'http://192.168.3.24:9002/curl/get'

2.2.5-T⇔--upload-file

  • 指定文件上傳
  • --request PUT可省略
  • --header 'Content-Type: text/plain':顯式指定上傳文件的 MIME 類型,即告訴服務器這個文件屬于哪種類型
curl --request PUT \
-v -w '\n' \
--header 'X-Filename: grep_cmd.txt' \
--header 'Content-Type: text/plain' \
--upload-file 'grep_cmd.txt' \
'http://192.168.3.24:9002/curl/put/file'

2.3 head相關

2.3.1-A⇔--user-agent指定用于代理字符串

curl命令,默認情況下使用User-Agent: curl/8.15.0,但是部分網(wǎng)站可能不允許User-Agent: curl/8.15.0的請求訪問

可以通過下面3種方式指定User-Agent,模擬瀏覽器訪問

# --user-agent 的方式
curl --get \
-v -w '\n' \
--user-agent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
'http://192.168.3.24:9002/curl/get'

# -A 的方式
curl -G \
-v -w '\n' \
-A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
'http://192.168.3.24:9002/curl/get'

# --header 的方式
curl -X GET \
-v -w '\n' \
--header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' \
'http://192.168.3.24:9002/curl/get'

2.3.2-H⇔--header指定請求頭

用于在發(fā)起請求的時候,添加請求頭

curl -v -w '\n' \
--header 'X-USER-ID: jmw110' \
-H 'X-TOKEN: abc123' \
--data 'order_id=order134' \
--data 'event=PLACED' \
'http://192.168.3.24:9002/curl/form/post'

2.3.3-i和-I和-D和--show-headers

-i:在輸出中包含服務器響應的 HTTP 頭部信息

  • -i--include
  • curl命令,默認只顯示響應體,加上 -i 就能看到響應頭信息。
  • 如果想調試 HTTP 接口、看響應狀態(tài)碼、內容類型、Cookie 等信息,-i 很有用。

-I:只請求并顯示響應頭,不下載正文,相當于發(fā)起HEAD請求

  • -I--head
  • 常用于檢查文件是否存在、獲取資源信息(如大小、類型、是否支持斷點續(xù)傳等)
  • 如果要測試資源是否存在、獲取內容大小,用 -I 就夠了
  • 如果要調試接口輸出結構,用 -i 更合適。

--show-headers的作用和-i相同,語義化更好,在最新的curl版本支持

-D:將服務器返回的 HTTP 響應頭(headers)輸出到指定文件或標準輸出

  • -D--dump-header
  • -o /dev/null:服務器的響應體(返回的數(shù)據(jù))不顯示到控制臺
curl -sS -D - \
'https://amazon.com'

curl -sS -D - \
-o /dev/null \
'https://amazon.com'

2.4 輸出相關

2.4.1-s和-S

  • -sSilent 模式,不顯示進度條等無關輸出
  • -S:配合-s使用,報錯時,顯示錯誤信息
# 顯示進度條
curl --get -w '\n' \
'http://192.168.3.24:9002/curl/get' | jq .

# 不顯示進度條, 但連接不上服務器報錯時, 什么也不輸出
curl --get -w '\n' \
-s \
'http://你好.168.3.24:9022/curl/get' | jq .

# 不顯示進度條, 但連接不上服務器報錯時, 顯示報錯信息
curl --get -w '\n' \
-sS \
'http://你好.168.3.24:9022/curl/get' | jq .
  • 當我們使用jq命令處理json數(shù)據(jù)的時候,顯示多余的進度條
  • 使用-s之后,多余的進度條消失

  • 但是使用-s之后,當我們請求不存在的ip地址時,并不會顯示任何錯誤
  • 使用-sS之后,錯誤信息被顯示在控制臺上

2.4.2-f⇔--fail快速失敗

  • 表示在請求失敗時(即服務器返回 400 或更高的狀態(tài)碼)不要輸出 HTML 錯誤頁面內容,只返回非零退出碼和錯誤信息。
  • 在寫腳本時非常有用,可以避免把錯誤頁面當作有效內容處理。
# 會顯示出錯誤時的json信息
curl --get 'https://api.github.com/users/user_not_exist'
# 服務器返回404狀態(tài)碼時,直接報錯
curl --get --fail 'https://api.github.com/users/user_not_exist'
  • 具體效果如下

2.4.3-v

  • 詳細模式(verbose),會顯示整個 HTTP 請求/響應過程,包括連接過程、請求頭、發(fā)送的數(shù)據(jù)等

2.4.4-w⇔--write-out

  • 在請求完成后輸出特定的信息(例如狀態(tài)碼、總時間、IP、響應大小等),用來輸出追加的情報
占位符含義
%{http_code}HTTP 響應狀態(tài)碼(如 200、404)
%{time_total}總耗時(秒),包括解析 DNS、建立連接等
%{time_namelookup}DNS 查詢耗時(秒)
%{time_connect}建立連接所耗時間(秒)
%{time_starttransfer}服務器開始響應的時間(秒)
%{remote_ip}連接的遠程服務器 IP
%{remote_port}遠程服務器端口
%{size_download}下載的字節(jié)數(shù)
%{size_upload}上傳的字節(jié)數(shù)
%{url_effective}最終的 URL(跟隨跳轉后的地址)
%{content_type}響應的 Content-Type 值

-w '\n':實現(xiàn)換行


顯示 IP、端口、響應時間

  • 注意:因為-w中有\n換行符,所以需要使用單引號而不是雙引號
curl -s -o /dev/null \
-w '\nIP: %{remote_ip}\n端口: %{remote_port}\n響應耗時: %{time_starttransfer} 秒\n' \
'https://example.com'

其他用法

apluser@FengYeHong-HP:~$ curl -sSf -o /dev/null \
-w '\nStatus: %{http_code}\nTime: %{time_total}s\n' \
'https://example.com'

Status: 200
Time: 0.538273s
# http頭以外的情報輸出為json
curl -sS -w '%{json}' -o /dev/null http://example.com | jq | head
# 將http頭的情報輸出為json的形式
curl -sS -w '%{header_json}' -o /dev/null 'https://api.github.com/users/fengyehong123' | jq | head
# 還可以這么用 %header{key的名字}
curl -sS -w '%header{content-length}\n' -o /dev/null 'https://api.github.com/users/fengyehong123'

2.4.5-o⇔--output和-O將響應內容保存到指定文件中

  • -o 后面的文件名是你手動指定的,即使 URL 里寫著別的名字,它也會被保存為你指定的那個文件名。
  • 如果文件已存在,curl 會覆蓋它,而不會提示。

  • -O(大寫)使用url里面的文件名進行下載

2.4.6-L⇔--location重定向

  • curl請求默認是不會重定向的
  • 使用-L配置項可以讓請求跟隨服務器進行重定向

2.5 其他參數(shù)

2.5.1-m和--connect-timeout

  • -m:最大請求時間為 ?秒,超時中斷
  • --connect-timeout:最大連接時間為 ?秒,連接不上就失敗

2.5.2--compressed

  • 告訴服務器你可以接受壓縮(比如 gzip、deflate、br)后的響應內容,同時在接收后自動為你解壓。
  • curl 默認不發(fā)送 Accept-Encoding,所以你需要手動加 --compressed 來啟用。

2.5.3--variable和--expand-url

2023年11月份release的8.3.0版本的curl命令添加了變量和變量展開功能

  • --variable:用于定義變量
  • --expand-*:用于展開變量
  • --expand-url:用來拓展url
curl -sS -w '\n' -v \
--variable 'port=9002' \
--expand-url 'http://192.168.3.24:{{port}}/curl/get/'

2.5.4--referer

簡介

  • 在 HTTP 請求中,Referer 表示請求來源頁面的 URL。
  • 服務器經(jīng)常用它來判斷請求是否是從合法頁面跳轉過來的。
  • --referer 就能手動偽造或修改這個字段。

常見用途

  • 繞過防盜鏈,比如有些網(wǎng)站的圖片或文件只允許從自己頁面訪問,檢查 Referer 是否是自己域名。
  • 模擬瀏覽器行為,模擬從某個網(wǎng)頁點擊進入另一個頁面。
  • 測試網(wǎng)站安全性。開發(fā)或測試時,可以偽造來源,檢查服務器是否依賴 Referer 來做安全控制。
curl --referer 'http://www.example.com' \
-fsS -D - -o /dev/null \
--location 'http://www.example.com'

三. 提交數(shù)據(jù)的常見格式

3.1 url傳參

curl --get -v -w '\n' \
-d 'INFILE=/data/path/out' \
--data 'JobId=CCMPLTEST01' \
--data 'OTFILE=/data/path/in' \
--data-urlencode 'name=賈 飛天' \
'http://192.168.3.24:9002/curl/get'

3.2application/x-www-form-urlencoded表單提交

curl -v -w '\n' \
--data 'order_id=order134' \
--data 'event=PLACED' \
'http://192.168.3.24:9002/curl/form/post'

3.3multipart/form-data表單提交

  • 在普通的表單提交中(application/x-www-form-urlencoded),所有數(shù)據(jù)都會被編碼為 URL 參數(shù)形式。
  • 但是普通的表單提交不能處理文件,也不能很好支持二進制數(shù)據(jù)。
  • 所以 HTTP 引入了 multipart/form-data 來實現(xiàn) 一部分是文本,一部分是文件/二進制 的提交功能。
curl -v -w '\n' \
--form 'file1=@grep_cmd.txt' \
--form 'jsonData1={"name":"wangwu","age":30,"card":["abc","bbc"]}' \
--form 'jsonData1=測試信息' \
--form 'jsonData1=["名字","年齡","住址"]' \
--form 'jsonData2={"name":"zhaoliu","age":20}' \
'http://192.168.3.24:9002/curl/file/upload'

3.4 json數(shù)據(jù)

curl -v -w '\n' \
--header 'Content-Type: application/json' \
--data-binary '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'
curl -v -w '\n' \
--json '{"order_id": "order134"}' \
'http://192.168.3.24:9002/curl/json/post'

3.5 xml數(shù)據(jù)

curl -v -X POST \
 --location https://postman-echo.com/post \
 -H "Content-Type: application/xml; charset=UTF-8" \
 -d '<?xml version="1.0" encoding="UTF-8"?>
     <order>
      <orderId>123</orderId>
      <total>99.9</total>
     </order>'

四. 案例

直接執(zhí)行網(wǎng)絡上的腳本

  • 下面這2種寫法相同
  • 執(zhí)行此類腳本一定要謹慎,要確保網(wǎng)絡腳本是可信任的
  • curl命令下載到的腳本內容直接作為標準輸入傳給 bash 執(zhí)行,也就是說,這個腳本文件根本不會保存到本地,而是邊下載邊執(zhí)行。
curl -fsSL 'https://raw.githubusercontent.com/fengyehong123/BashStudy/refs/heads/main/99-技巧/04-隨機/01-$RANDOM隨機數(shù)和隨機字符串.sh' | bash
bash <(curl -fsSL 'https://raw.githubusercontent.com/fengyehong123/BashStudy/refs/heads/main/99-技巧/04-隨機/01-$RANDOM隨機數(shù)和隨機字符串.sh')

?下載網(wǎng)站上的圖片

tr ' ' '\n':將空格替換為換行符,確保每一個網(wǎng)址一行

xargs -n 1 -P 10

  • -n 1 → 每次取 1 個參數(shù) 傳給 command
  • -P 10 → 最多同時運行 10 個 command 進程(并行執(zhí)行)

--retry 3 --retry-delay 2

  • --retry 5 → 失敗時最多重試 3 次
  • --retry-delay 2 → 兩次重試間隔 2 秒
echo https://www.itzmx.com/{1..499}.webp | \
tr ' ' '\n' | \
xargs -n 1 -P 10 \
curl -s -O --retry 3 --retry-delay 2

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Linux 中不輸入密碼運行 sudo 命令的方法

    Linux 中不輸入密碼運行 sudo 命令的方法

    sudo命令允許受信任的用戶作為另一個用戶運行程序,默認情況下是root用戶。這篇文章主要介紹了Linux 中不輸入密碼運行 sudo 命令的方法,需要的朋友可以參考下
    2019-07-07
  • linux下安裝配置svn獨立服務器的步驟分享

    linux下安裝配置svn獨立服務器的步驟分享

    subversion(以下簡稱svn)是近年來崛起的版本管理工具,是cvs的接班人。 svn服務器有2種運行方式:獨立服務器和借助apache。2種方式各有利弊
    2011-05-05
  • Linux中grep和egrep命令詳解

    Linux中grep和egrep命令詳解

    在本篇文章里小編給大家整理的是關于Linux之grep和egrep命令總結內容,有需要的朋友們參考學習下。
    2019-10-10
  • centos通過yum安裝php的教程

    centos通過yum安裝php的教程

    這篇文章主要介紹了centos通過yum安裝php的教程,本文給大家提到了CentOS 7下Yum安裝PHP7.2步驟,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Linux系統(tǒng)中查看文件夾或文件大小的命令小結

    Linux系統(tǒng)中查看文件夾或文件大小的命令小結

    在日常運維和開發(fā)工作中,了解文件夾和文件占用的磁盤空間是非常重要的,在 Linux 系統(tǒng)中,我們可以使用一些簡單的命令來查看文件夾或文件的大小,下面小編就來詳細介紹一下吧
    2025-08-08
  • linux下用cron定時執(zhí)行任務的方法

    linux下用cron定時執(zhí)行任務的方法

    呵呵,比較有用,網(wǎng)上摘抄的。留著備用吧。
    2008-06-06
  • linux系統(tǒng)虛擬主機開啟支持Swoole Loader擴展的方法

    linux系統(tǒng)虛擬主機開啟支持Swoole Loader擴展的方法

    這篇文章主要介紹了linux系統(tǒng)虛擬主機開啟支持Swoole Loader擴展的方法,需要的朋友可以參考下
    2020-12-12
  • Linux遠程訪問及控制方式

    Linux遠程訪問及控制方式

    SSH(Secure Shell)是一種協(xié)議,用于安全地通過不安全的網(wǎng)絡進行遠程登錄和其他網(wǎng)絡服務,OpenSSH是SSH協(xié)議的一種開源實現(xiàn),它支持數(shù)據(jù)加密,能有效防止信息泄露,適用于多種操作系統(tǒng),SSH配置包括服務端和客戶端,可以通過密碼或密鑰對驗證方式進行身份驗證
    2024-09-09
  • VSCode連接實驗室服務器Xshell,Xftp向服務器傳輸文件的方法(win10)

    VSCode連接實驗室服務器Xshell,Xftp向服務器傳輸文件的方法(win10)

    這篇文章主要介紹了VSCode連接實驗室服務器,Xshell,Xftp向服務器傳輸文件(win10),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • CentOS解壓rar格式包實現(xiàn)過程

    CentOS解壓rar格式包實現(xiàn)過程

    文章主要介紹了如何解決yum安裝報錯的問題,提供了離線安裝32位和64位包的方法,并詳細介紹了如何使用unrar命令進行解壓
    2026-01-01

最新評論

巫山县| 徐汇区| 杭锦后旗| 玉树县| 青川县| 扶绥县| 平阳县| 阿拉善盟| 茶陵县| 邵武市| 澄城县| 绵阳市| 广德县| 旌德县| 龙海市| 孟连| 于都县| 衢州市| 广饶县| 远安县| 包头市| 金塔县| 黄陵县| 沙雅县| 荣昌县| 镇沅| 莆田市| 武功县| 惠州市| 类乌齐县| 陇川县| 临海市| 忻城县| 巴林右旗| 马山县| 萨迦县| 衡水市| 黄梅县| 许昌县| 诏安县| 香河县|