คำสั่ง curl: วิธีใช้ตัวเลือก คำขอ POST และการดาวน์โหลดไฟล์

สภาพแวดล้อมทดสอบตระกูล RHELAlmaLinux 9.8บัญชี rootตรวจสอบเมื่อ 2026-10-28

คำสั่ง curl เป็นเครื่องมือที่ส่งคำขอไปยังที่อยู่เว็บจากเทอร์มินัลและแสดงผลการตอบกลับออกมาตามที่ได้รับ ใช้คำสั่งบรรทัดเดียวก็ตรวจเนื้อหาของหน้า เฮดเดอร์ และรหัสสถานะได้ เมื่อเราส่งคำขอ curl จากเซิร์ฟเวอร์ AlmaLinux 9 ไปยังเว็บไซต์ WordPress ที่อยู่ http ตอบกลับด้วย 301 เพื่อชี้ไปยังที่อยู่ https และคำขอ REST API ที่ไม่มีการยืนยันตัวตนถูกปฏิเสธด้วย 401

1️⃣ วิธีใช้คำสั่ง curl เบื้องต้นและเนื้อหาการตอบกลับ

ใส่ที่อยู่หนึ่งรายการต่อท้าย curl แล้ว curl จะส่งคำขอ GET ไปยังที่อยู่นั้นและแสดงเนื้อหาการตอบกลับบนหน้าจอ เมื่อเราขอไฟล์ robots.txt ที่ WordPress สร้างขึ้น เนื้อหาไฟล์สามบรรทัดก็แสดงออกมาตามเดิม

curl https://example.com/robots.txt
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

เรามักคาดว่าจะเห็นหน้าเดียวกับตอนพิมพ์ที่อยู่ในเบราว์เซอร์ แต่สิ่งที่ curl แสดงคือ HTML ดิบที่เซิร์ฟเวอร์ส่งมา curl ไม่รันสคริปต์และไม่ขอรูปภาพหรือ CSS แยกต่างหาก HTML ของหน้าเว็บยาว เราจึงส่งเอาต์พุตของที่อยู่หน้าเว็บผ่านไปป์ไปให้ head แล้วดูเฉพาะไม่กี่บรรทัดแรก

curl -s https://example.com/ | head -n 2
<!DOCTYPE html>
<html lang="ko-KR">

ใส่ -s แล้วตัวแสดงความคืบหน้าที่ปนอยู่บนหน้าจอเวลาส่งเอาต์พุตผ่านไปป์จะถูกซ่อน HTML ที่ได้จากที่อยู่หน้าแรกเพียงที่อยู่เดียวมีขนาด 96,679 ไบต์ ขนาดนี้ไม่รวมไฟล์รูปภาพและสคริปต์

2️⃣ ตรวจเฮดเดอร์ด้วย curl -I และตามการเปลี่ยนเส้นทางด้วย -L

ดูแค่เนื้อหาจะไม่รู้ว่าคำขอสำเร็จหรือไม่ จึงตรวจรหัสสถานะและเฮดเดอร์แยกด้วย -I โดย -I ส่งคำขอ HEAD และแสดงเฉพาะเฮดเดอร์ของการตอบกลับโดยไม่มีเนื้อหา เหมือนดูใบปะหน้าพัสดุโดยไม่ต้องเปิดกล่อง

curl -I https://example.com/
HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400

[HTTP/2 200] ในบรรทัดแรกคือรหัสสถานะ ด้านล่างตามด้วยชนิดเซิร์ฟเวอร์ ชนิดเนื้อหา และเฮดเดอร์ที่เกี่ยวกับแคช ถ้าส่งคำขอเดียวกันไปยังที่อยู่ http จะได้ 301 พร้อมที่อยู่ https ปลายทางในเฮดเดอร์ [Location]

curl -I http://example.com/
HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:27:51 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

เมื่อเราขอที่อยู่ http โดยไม่ใส่ตัวเลือก curl ไม่ได้ส่งคำขอซ้ำไปยังที่อยู่ใน [Location] แต่แสดงเฉพาะเนื้อหา 7 บรรทัดของการตอบกลับ 301 แล้วจบการทำงาน

curl http://example.com/
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.28.0</center>
</body>
</html>

ใส่ -L แล้ว curl จะส่งคำขอซ้ำไปยังที่อยู่ใน [Location] ถ้ารวมกับ -I เป็น -IL เฮดเดอร์ของการตอบกลับ 301 จะตามด้วยเฮดเดอร์ของการตอบกลับ 200 ตามลำดับ

curl -IL http://example.com/
HTTP/1.1 301 Moved Permanently
Server: nginx/1.28.0
Date: Wed, 28 Oct 2026 05:29:23 GMT
Content-Type: text/html
Content-Length: 169
Connection: keep-alive
Location: https://example.com/

HTTP/2 200
server: nginx/1.28.0
date: Wed, 28 Oct 2026 05:29:23 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
last-modified: Tue, 27 Oct 2026 21:12:18 GMT
cache-control: max-age=0
expires: Wed, 28 Oct 2026 05:29:23 GMT
accept-ranges: none
alt-svc: h3=":443"; ma=86400

ในแผนภาพด้านล่าง คุณเทียบได้ทีละขั้นว่าแต่ละตัวเลือกส่งคำขอกี่ครั้งและหน้าจอแสดงอะไร

🧭 คำขอและเอาต์พุตตามตัวเลือก curl: 301 จากที่อยู่ http
แผนภาพอธิบาย
⚙️ ตัวเลือก
$ curl -I -L -IL http://example.com/
① GETHEAD คำขอhttp://example.com/
➜
301 Moved PermanentlyLocation: https://example.com/
② GETHEAD คำขอhttps://example.com/ไม่ส่งคำขอ
➜
200ไม่มีการตอบกลับ
🖥️ สิ่งที่แสดงบนหน้าจอ
เนื้อหาการตอบกลับ 301 (HTML 7 บรรทัด)
เฮดเดอร์การตอบกลับ 301 จำนวน 7 บรรทัด
เนื้อหาการตอบกลับ 200 (HTML หน้าแรก 96,679 ไบต์)
เฮดเดอร์ 301 จำนวน 7 บรรทัด → เฮดเดอร์ 200 จำนวน 10 บรรทัด
เมื่อไม่ใส่ตัวเลือก curl จะไม่ส่งคำขอซ้ำไปยังที่อยู่ https ใน [Location] และแสดงเฉพาะเนื้อหาของการตอบกลับ 301
-I รับเฉพาะเฮดเดอร์ด้วยคำขอ HEAD และแสดงสถานะ 301 กับเฮดเดอร์ [Location] โดยไม่ส่งคำขอไปยังที่อยู่ใหม่
-L ส่งคำขออีกครั้งไปยังที่อยู่ https ใน [Location] และแสดงเนื้อหาของการตอบกลับ 200 สุดท้าย
-IL แสดงเฮดเดอร์ของการตอบกลับทั้งสองครั้งตามลำดับ หลัง 301 ตามด้วย 200

3️⃣ ดาวน์โหลดไฟล์ด้วยคำสั่ง curl (-o, -O)

-O บันทึกไฟล์ลงโฟลเดอร์ปัจจุบันด้วยชื่อไฟล์ท้ายสุดของที่อยู่ ระหว่างบันทึกหน้าจอจะแสดงตัวแสดงความคืบหน้าแทนเนื้อหา

curl -O https://example.com/wp-includes/images/w-logo-blue.png
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  3113  100  3113    0     0   178k      0 --:--:-- --:--:-- --:--:--  190k
ls -l w-logo-blue.png
-rw-r--r-- 1 root root 3113 Oct 28 14:29 w-logo-blue.png

หลังดาวน์โหลด [Total] และ [Received] ในตัวแสดงความคืบหน้าเป็น 3113 เท่ากัน และขนาดไฟล์ที่ตรวจด้วย ls -l ก็ตรงกันที่ 3,113 ไบต์

ถ้าต้องการตั้งชื่อไฟล์เอง ให้เขียนชื่อไฟล์ต่อท้าย -o ด้านล่างคือผลของการบันทึกที่อยู่หน้าแรกเป็น home.html

curl -o home.html https://example.com/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed

  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 96679    0 96679    0     0  4291k      0 --:--:-- --:--:-- --:--:-- 4291k
ls -l home.html
-rw-r--r-- 1 root root 96679 Oct 28 14:29 home.html

-O ใช้ชื่อไฟล์ท้ายที่อยู่ตามเดิม จึงไม่เหมาะกับที่อยู่หน้าเว็บที่ลงท้ายด้วยเครื่องหมายทับ ถ้าใส่ -O กับที่อยู่หน้าแรก curl จะหาชื่อไฟล์ไม่เจอและจบการทำงานพร้อมข้อผิดพลาดด้านล่าง

curl -O https://example.com/
curl: Remote file name has no length!
curl: (23) Failed writing received data to disk/application

4️⃣ คำขอ POST ของ curl และการส่งข้อมูล JSON

ถ้าต้องการส่งข้อมูลไปกับคำขอที่ก่อนหน้านี้ใช้แค่อ่าน ให้ใช้ -d และเพิ่ม -H เพื่อระบุรูปแบบข้อมูล -d ส่งข้อมูลที่เขียนต่อท้ายเป็นเนื้อหา POST ถ้าไม่ได้กำหนดอะไรเพิ่ม [Content-Type] จะเป็น [application/x-www-form-urlencoded]

เมื่อใช้ -d วิธีของคำขอจะเปลี่ยนเป็น POST จึงละ [-X POST] ได้ เอกสารทางการก็อธิบายว่าโดยปกติไม่จำเป็นต้องใช้ -X

เวลาส่ง JSON ให้ใช้ -H เปลี่ยน [Content-Type] เป็น [application/json] ด้านล่างคือผลของการส่งคำขอสร้างโพสต์ไปยัง REST API ของ WordPress โดยไม่ยืนยันตัวตน

curl -s -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts
{"code":"rest_authentication_error","message":"\uc8c4\uc1a1\ud569\ub2c8\ub2e4. REST API \uc694\uccad\uc744 \ud560 \uc218 \uc788\ub294 \uad8c\ud55c\uc774 \uc5c6\uc2b5\ub2c8\ub2e4.","data":{"status":401}}

เว็บไซต์ที่เราส่งคำขอไป บล็อกคำขอ REST API จากผู้ที่ไม่ได้เข้าสู่ระบบ code จึงได้ [rest_authentication_error] กลับมาและสถานะเป็น 401 ด้วยการตั้งค่าเดียวกัน การขอรายการโพสต์ด้วย GET ที่ที่อยู่เดียวกันก็ได้ 401 กลับมาเช่นกัน ค่า message คือประโยคข้อผิดพลาดที่เขียนเป็นภาษาของเว็บไซต์แล้วถูกแปลงเป็นรูปแบบ Unicode ของ JSON

ถ้าต้องการดูเฉพาะรหัสสถานะ ให้ทิ้งเนื้อหาด้วย [-o /dev/null] และใช้ -w แสดงเฉพาะ http_code

curl -s -o /dev/null -w '%{http_code}\n' -X POST -H 'Content-Type: application/json' -d '{"title":"curl test"}' https://example.com/wp-json/wp/v2/posts
401

5️⃣ วัดเวลาตอบกลับด้วยคำสั่ง curl (-w)

เวลาการตอบกลับช้า เรามักดูแค่ total แต่จะรู้ว่าเวลาหมดไปกับการเชื่อมต่อหรือการประมวลผลของเซิร์ฟเวอร์ ต้องแสดงเวลาของแต่ละช่วงแยกกัน -w แสดงค่าที่วัดได้ในรูปแบบที่กำหนดหลังคำขอเสร็จ ค่าจะถูกใส่ลงในตำแหน่ง [%{ชื่อตัวแปร}] ในรูปแบบ

ทิ้งเนื้อหาด้วย [-o /dev/null] และซ่อนตัวแสดงความคืบหน้าด้วย -s

curl -o /dev/null -s -w 'code: %{http_code}\nconnect: %{time_connect}\ntls: %{time_appconnect}\nttfb: %{time_starttransfer}\ntotal: %{time_total}\n' https://example.com/
code: 200
connect: 0.001507
tls: 0.017728
ttfb: 0.021912
total: 0.022825

connect คือการเชื่อมต่อ TCP, tls คือการเจรจา TLS, ttfbคือเวลาจนถึงก่อนส่งไบต์แรก และ total คือเวลาจนการส่งเสร็จ ทั้งสี่ค่าเป็นวินาทีที่นับสะสมตั้งแต่เริ่มคำขอ

เพราะเซิร์ฟเวอร์ที่รัน curl กับเว็บไซต์ที่รับคำขออยู่บนเซิร์ฟเวอร์เดียวกัน การเชื่อมต่อจึงใช้เพียง 0.0015 วินาที การเจรจา TLS เสร็จที่ 0.0177 วินาที และไบต์แรกมาถึงที่ 0.0219 วินาที ตั้งแต่การเจรจา TLS เสร็จจนไบต์แรกมาถึงใช้เวลาประมาณ 0.004 วินาที เอกสารทางการอธิบายว่าช่วงนี้รวมเวลาที่เซิร์ฟเวอร์ใช้สร้างผลลัพธ์

เมื่อรันคำสั่งเดิมอีกสามครั้ง total อยู่ระหว่าง 0.0219 ถึง 0.0226 วินาที

🔲 ตัวจำลองคำสั่ง curl

ในตัวจำลองด้านล่าง คุณพิมพ์คำสั่งที่ผ่านมาได้เองและดูว่าเอาต์พุตเปลี่ยนไปอย่างไรตามตัวเลือก

ตัวจำลองคำสั่ง curlcurl 7.76.1
[root@server work]#
ใช้ปุ่ม ↑↓ บนแป้นพิมพ์เพื่อเรียกคำสั่งที่พิมพ์ไว้ก่อนหน้ากลับมา

🔢 FAQ & เนื้อหาแนะนำ

-s ซ่อนทั้งตัวแสดงความคืบหน้าและข้อความข้อผิดพลาด เมื่อเราขอที่อยู่ที่ไม่มีอยู่จริง ไม่มีอะไรแสดงออกมาและเหลือเพียงรหัสออก 6 ถ้าระบุ -sS ด้วยกัน ตัวแสดงความคืบหน้ายังถูกซ่อน แต่ข้อผิดพลาดอย่าง [curl: (6) Could not resolve host] ยังแสดงตามเดิม

-k ข้ามขั้นตอนที่ตรวจว่าการเชื่อมต่อปลอดภัยหรือไม่ curl จึงส่งข้อมูลโดยไม่ตรวจว่าเซิร์ฟเวอร์ที่เชื่อมต่อเป็นของโดเมนนั้นจริง curl ตรวจว่าใบรับรองของเซิร์ฟเวอร์มีชื่อโดเมนที่เชื่อมต่ออยู่หรือไม่ และตรวจสอบกับที่เก็บใบรับรองได้หรือไม่ ถ้าเกิดข้อผิดพลาดนี้ ให้ตรวจชื่อโดเมนและผู้ออกใบรับรองก่อน

ตามเอกสารทางการ เมื่อได้รับการตอบกลับ 301, 302 หรือ 303 curl จะเปลี่ยนคำขอถัดไปเป็น GET แล้วส่ง ถ้าต้องการคง POST ไว้ ให้ใช้ตัวเลือกเฉพาะอย่าง [--post301] วิธีที่กำหนดด้วย -X มีผลเหนือการเปลี่ยนนี้

🧭 เนื้อหาคำสั่งเครือข่ายแนะนำ 9 บทความ · 2 อ้างอิง
🗂️ คำสั่งเครือข่าย
📄 คำสั่ง SSH 📄 คำสั่ง rsync 📄 คำสั่ง wget 📄 คำสั่ง rz · sz 📄 คำสั่ง curl
📄 คำสั่ง host 📄 คำสั่ง nslookup
📄 คำสั่ง ip 📄 คำสั่ง netstat · ifconfig
Linux SSH (Secure Shell)
Linux · การเชื่อมต่อ
คำสั่ง SSH: ตัวเลือกและวิธีใช้
ใน Linux SSH (Secure Shell) เป็นโปรโตคอลที่ช่วยให้เชื่อมต่อกับระบบอื่นผ่านเครือข่ายได้อย่างปลอดภัย
อ่านบทความ →เนื้อหาปัจจุบัน
คำสั่ง rsync_ส่งจากโลคัลไปยังระยะไกล
Linux · การส่งไฟล์
คำสั่ง rsync ของ Linux: ตัวเลือก | ตัวอย่างการใช้งาน
ถ้าคัดลอกใหม่ทั้งหมดทุกครั้งเพื่อให้โฟลเดอร์ของเซิร์ฟเวอร์ 2 เครื่องตรงกัน แม้จะมีไฟล์ที่เปลี่ยนเพียงไฟล์เดียว ปริมาณข้อมูลที่ส่งก็ยังเท่ากับขนาดทั้งหมด
อ่านบทความ →เนื้อหาปัจจุบัน
คำสั่ง TOP ของ Linux: อินเทอร์เฟซบรรทัดคำสั่ง (CLI-Command-Line Interface)
Linux · การส่งไฟล์
คำสั่ง wget ของ Linux
คำสั่ง wget ใช้เรียกลิงก์ดาวน์โหลดบนเว็บจากบรรทัดคำสั่งของ Linux เพื่อดาวน์โหลดไฟล์
อ่านบทความ →เนื้อหาปัจจุบัน
ติดตั้งเครื่องมือ lrzsz บน Rocky Linux
Linux · การส่งไฟล์
Linux: ติดตั้งเครื่องมือ lrzsz และอัปโหลด (rz) กับดาวน์โหลด (sz) ไฟล์
ถ้าจะใช้คำสั่ง rz และ sz อัปโหลดและดาวน์โหลดไฟล์บน Linux ต้องติดตั้ง lrzsz ไว้บนเซิร์ฟเวอร์
อ่านบทความ →เนื้อหาปัจจุบัน
แผนภาพคำสั่ง curl แสดงคำขอและเอาต์พุตตามตัวเลือก: -IL แสดงเฮดเดอร์ 301 แล้วตามด้วยเฮดเดอร์ 200
Linux · การส่งไฟล์
คำสั่ง curl: วิธีใช้ตัวเลือก คำขอ POST และการดาวน์โหลดไฟล์
curl คือเครื่องมือที่ส่งคำขอไปยังที่อยู่เว็บจากเทอร์มินัลและแสดงผลการตอบกลับตามที่ได้รับ ใช้คำสั่ง curl คำสั่งเดียวก็ตรวจเนื้อหาของหน้า เฮดเดอร์ และรหัสสถานะได้
อ่านบทความ →เนื้อหาปัจจุบัน

ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

Prove your humanity: 7   +   10   =