คำสั่ง curl: วิธีใช้ตัวเลือก คำขอ POST และการดาวน์โหลดไฟล์
คำสั่ง curl เป็นเครื่องมือที่ส่งคำขอไปยังที่อยู่เว็บจากเทอร์มินัลและแสดงผลการตอบกลับออกมาตามที่ได้รับ ใช้คำสั่งบรรทัดเดียวก็ตรวจเนื้อหาของหน้า เฮดเดอร์ และรหัสสถานะได้ เมื่อเราส่งคำขอ curl จากเซิร์ฟเวอร์ AlmaLinux 9 ไปยังเว็บไซต์ WordPress ที่อยู่ http ตอบกลับด้วย 301 เพื่อชี้ไปยังที่อยู่ https และคำขอ REST API ที่ไม่มีการยืนยันตัวตนถูกปฏิเสธด้วย 401
1️⃣ วิธีใช้คำสั่ง curl เบื้องต้นและเนื้อหาการตอบกลับ
ใส่ที่อยู่หนึ่งรายการต่อท้าย curl แล้ว curl จะส่งคำขอ GET ไปยังที่อยู่นั้นและแสดงเนื้อหาการตอบกลับบนหน้าจอ เมื่อเราขอไฟล์ robots.txt ที่ WordPress สร้างขึ้น เนื้อหาไฟล์สามบรรทัดก็แสดงออกมาตามเดิม
curl https://example.com/robots.txtUser-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ในแผนภาพด้านล่าง คุณเทียบได้ทีละขั้นว่าแต่ละตัวเลือกส่งคำขอกี่ครั้งและหน้าจอแสดงอะไร
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 --:--:-- --:--:-- --:--:-- 190kls -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 --:--:-- --:--:-- --:--:-- 4291kls -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/application4️⃣ คำขอ 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/posts4015️⃣ วัดเวลาตอบกลับด้วยคำสั่ง 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.022825connect คือการเชื่อมต่อ TCP, tls คือการเจรจา TLS, ttfbคือเวลาจนถึงก่อนส่งไบต์แรก และ total คือเวลาจนการส่งเสร็จ ทั้งสี่ค่าเป็นวินาทีที่นับสะสมตั้งแต่เริ่มคำขอ
เพราะเซิร์ฟเวอร์ที่รัน curl กับเว็บไซต์ที่รับคำขออยู่บนเซิร์ฟเวอร์เดียวกัน การเชื่อมต่อจึงใช้เพียง 0.0015 วินาที การเจรจา TLS เสร็จที่ 0.0177 วินาที และไบต์แรกมาถึงที่ 0.0219 วินาที ตั้งแต่การเจรจา TLS เสร็จจนไบต์แรกมาถึงใช้เวลาประมาณ 0.004 วินาที เอกสารทางการอธิบายว่าช่วงนี้รวมเวลาที่เซิร์ฟเวอร์ใช้สร้างผลลัพธ์
เมื่อรันคำสั่งเดิมอีกสามครั้ง total อยู่ระหว่าง 0.0219 ถึง 0.0226 วินาที
🔲 ตัวจำลองคำสั่ง curl
ในตัวจำลองด้านล่าง คุณพิมพ์คำสั่งที่ผ่านมาได้เองและดูว่าเอาต์พุตเปลี่ยนไปอย่างไรตามตัวเลือก
🔢 FAQ & เนื้อหาแนะนำ






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

