หากคุณเคยติดตามคำแนะนำการติดตั้งแอปพลิเคชัน Linux ที่เน้นเทอร์มินัลมาเรื่อยๆ คุณน่าจะเคยเห็นคำสั่ง curl บ้างแล้ว cURL เป็นเครื่องมือบรรทัดคำสั่งสำหรับถ่ายโอนข้อมูลด้วย URL การใช้งานที่ง่ายที่สุดคือการดาวน์โหลดไฟล์ผ่านบรรทัดคำสั่ง แต่ cURL มีความสามารถมากกว่านั้นมาก
cURL คืออะไร?
Daniel Sternberg เขียน cURL ในปี 1996 เพื่อดึงข้อมูลทางการเงินจากเว็บเซิร์ฟเวอร์และส่งออกไปยังช่อง IRC ต่อมา cURL พัฒนาเป็นเครื่องมืออันทรงพลังสำหรับดึงข้อมูลโดยไม่ต้องใช้เบราว์เซอร์ หากคุณใช้เทอร์มินัลตลอดเวลา cURL จะเป็นหนึ่งในเครื่องมือสำคัญที่สุดในอาร์เซนัลของคุณ
ในส่วนใหญ่ของ Linux distributions cURL ถูกติดตั้งมากับระบบแล้ว สามารถใช้งานได้ทันที แม้จะไม่ได้ติดตั้ง ก็พบได้ใน repository ส่วนใหญ่ จึงติดตั้งผ่าน Software Center ได้ง่าย
สำหรับ Windows ไม่มีคำสั่ง "curl-like" ในขณะที่ macOS มี cURL ติดตั้งมากับระบบ แต่ไม่มีฟลै็กมากเท่ากับเวอร์ชัน Linux
การติดตั้ง
ก่อนจะดำเนินการต่อ ต้องตรวจสอบก่อนว่า cURL ติดตั้งอยู่ในระบบแล้วหรือยัง
Linux
บน Debian/Ubuntu-based distros ใช้คำสั่ง:
sudo apt install curl
บน Arch-based distros:
sudo pacman -S curl
บน Fedora/CentOS/RHEL:
sudo dnf install curl
macOS
macOS มี cURL ติดตั้งมากับระบบแล้ว ไม่ต้องทำอะไรเพิ่มเติม
Windows
- สำหรับ Windows 7/10/11 ไปที่หน้าดาวน์โหลด cURL เลือกแพ็กเกจ 64-bit หรือ 32-bit ตามสถาปัตยกรรมที่ใช้ หากไม่แน่ใจ ให้เลือก 64-bit เพราะฮาร์ดแวร์ส่วนใหญ่หลังปี 2006 ใช้ 64-bit
- สร้างโฟลเดอร์บนไดรฟ์ระบบหรือใน "C:\Program Files\" ชื่อ "cURL"
- เปิดไฟล์ zip ที่ดาวน์โหลดมา หา "curl.exe" ในโฟลเดอร์ "bin" คัดลอกไปวางในโฟลเดอร์ cURL ที่สร้างไว้ ไฟล์ EXE นี้ทำงานได้ทุกแบบเหมือนบน Linux
- เพื่อให้คำสั่งนี้ใช้งานได้จากที่ไหนก็ได้ ต้องเพิ่มลงในตัวแปร PATH ของ Windows
- คลิกเมนู Start พิมพ์
environmentแล้วกด Enter - คลิก "Environment Variables..." จะเข้าสู่หน้าตั้งค่าตัวแปรสภาพแวดล้อม
- เลือกตัวแปร "Path" แล้วคลิก "Edit..."
- ในหน้าต่างแก้ไข PATH คลิก "New" แล้วพิมพ์ไดเรกทอรีที่วาง "curl.exe" ไว้ เช่น "C:\Program Files\cURL"
- คลิก "OK" บนหน้าต่างทุกอันที่เปิดอยู่ และเพลิดเพลินกับ cURL ในเทอร์มินัลได้เลย!
ทุกฟลากของ cURL ที่ใช้ได้ใน Linux ควรจะทำงานในเวอร์ชัน Windows ได้หมด
ข้อควรระวัง: จำไว้ว่า Command Prompt ไม่ใช่ Windows Terminal Windows Terminal มาพร้อม cURL ใน PowerShell ที่ทำงานคล้ายกันแต่ต่างกันทั้งหมด
เริ่มใช้งาน cURL
พิมพ์ curl maketecheasier.com ในเทอร์มินัลแล้วกด Enter
หากไม่มีเอาต์พัท แสดงว่าเซิร์ฟเวอร์ของเว็บไซต์นี้ไม่ได้ตั้งค่าตอบสนองต่อคำขอเชื่อมต่อแบบสุ่มไปที่โดเมน non-www หากคุณพยายามเข้าถึงเซิร์ฟเวอร์ที่ไม่มีอยู่จริงหรือออฟไลน์ จะได้ข้อความผิดพลาดว่า cURL ไม่สามารถ resolve host ได้
เพื่อให้ cURL ทำงานได้จริง ต้องระบุโปรโตคอล ในตัวอย่างนี้ใช้ HTTPS เพื่อเรียกหน้าแรกของเว็บไซต์นี้ พิมพ์ curl https://www.maketecheasier.com
หากสำเร็จ จะเห็นกำแพงข้อมูลขนาดใหญ่ เพื่อให้ข้อมูลอ่านง่ายขึ้น สั่งให้ cURL บันทึกลงไฟล์ HTML:
curl https://www.maketecheasier.com > ~/Downloads/mte.html
คำสั่งนี้จะนำเนื้อหาของเว็บไซต์ไปบันทึกเป็นไฟล์ HTML ในโฟลเดอร์ Downloads เปิดไฟล์นั้นด้วยไฟล์แมเนเจอร์ จะเห็นสแนปชอตของหน้าแรกเว็บไซต์
สามารถใช้ฟลาก -o เพื่อผลลัพธ์เดียวกัน:
curl -o ~/Downloads/mte.html https://www.maketecheasier.com
การติดตาม Redirect
เว็บไซต์ส่วนใหญ่ redirect จาก "http" ไป "https" โดยอัตโนมัติ ใน cURL ใช้ฟลาก -L จะติดตาม redirect 301 จนกว่าจะถึงหน้าที่อ่านได้
curl -L https://google.com.
การดาวน์โหลดต่อเนื่อง (Resume)
เมื่อดาวน์โหลดไฟล์ขนาดใหญ่ การขาดขาดการเชื่อมต่อทำให้รำคาญ cURL มีฟังก์ชัน resume ด้วยฟลาก -C
ตัวอย่างจริง: หยุดการดาวน์โหลด Debian testing ISO ขึ้นใจโดยกด Ctrl+C ระหว่างดาวน์โหลด
คำสั่งถัดไปใช้ฟลาก -C:
curl -C - -o ~/Downloads/debiantesting.iso -L https://cdimage.debian.org/cdimage/weekly-builds/amd64/iso-dvd/debian-testing-amd64-DVD-1.iso
การดาวน์โหลดดำเนินต่อจากจุดที่หยุดไว้ได้สำเร็จ
การดาวน์โหลดหลายไฟล์พร้อมกัน
cURL ไม่มีวิธีดาวน์โหลดหลายไฟล์ที่直觀 แต่มี 2 วิธี แต่ละวิธีมีข้อเสียเปรียบของตัวเอง
หากไฟล์ที่ดาวน์โหลดเป็นลำดับ (เช่น file1, file2...) ใช้วงเล็บเพื่อระบุช่วง และ "#" ภายในเอาต์พุตที่ระบุด้วยฟลาก -o ตัวอย่าง:
curl "https://example.com/file[1-5].zip" -o "#1_#2"
วิธีง่ายกว่าใช้ -O (--remote-name) ฟลากนี้ทำให้ cURL ดาวน์โหลดไฟล์ระยะไกลมาเป็นไฟล์ท้องถิ่นชื่อเดียวกัน เนื่องจากไม่ต้องระบุเอาต์พุต จึงควรใช้เมื่อเปิดเทอร์มินัลอยู่ในไดเรกทอรีที่ต้องการดาวน์โหลด
curl -O "https://example.com/file1.zip" -O "https://example.com/file2.zip"
หากมีไฟล์ลำดับมากมาย --remote-name-all เหมาะกว่า:
curl --remote-name-all "https://example.com/file[1-5].zip"
แม้ไฟล์ไม่ใช่ลำดับแต่มาจากไซต์เดียวกัน ก็สามารถระบุได้โดยไม่ต้องพิมพ์ URL ซ้ำด้วยวงเล็บปีกกา:
curl --remote-name-all "https://example.com/{file1.zip,anotherfile.zip,thisisfun.zip}"
การดาวน์โหลดพร้อมการยืนยันตัวตน
ดาวน์โหลดไฟล์ที่ต้องการ authentication (เช่น FTP server แบบส่วนตัว) ด้วยฟลาก -u ระบุ username แล้วตามด้วย password คั่นด้วย colon ตัวอย่าง:
curl -u username:password -o ~/Downloads/file.zip ftp://example.com/file.zip
จะยืนยันตัวตน bonobo_bob เข้า FTP server และดาวน์โหลดไฟล์ไปที่โฟลเดอร์ Downloads
การแบ่งและรวมไฟล์
หากต้องการดาวน์โหลดไฟล์ขนาดใหญ่และแบ่งเป็นชิ้นเล็กๆ ใช้ฟลาก --range ของ cURL ระบุ byte เริ่มต้นจนถึง byte สิ้นสุด หากไม่ระบุจุดสิ้นสุด จะดาวน์โหลดจนจบไฟล์
คำสั่งด้านล่างดาวน์โหลด 100 MB แรกของ Arch Linux installation image:
curl --range 0-99999999 -o arch.part1 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso
สำหรับ 100 MB ถัดไป ใช้ --range 100000000-199999999 เป็นต้น สามารถต่อคำสั่งด้วย &&:
curl --range 0-99999999 -o arch.part1 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 100000000-199999999 -o arch.part2 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 200000000-299999999 -o arch.part3 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 300000000-399999999 -o arch.part4 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 400000000-499999999 -o arch.part5 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 500000000-599999999 -o arch.part6 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 600000000-699999999 -o arch.part7 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso && \ curl --range 700000000- -o arch.part8 -L https://mirrors.chroot.ro/archlinux/iso/2021.11.01/archlinux-2021.11.01-x86_64.iso
หากทำตามคำสั่งข้างต้น จะได้ไฟล์ 8 ไฟล์ในตำแหน่งที่กำหนด
เพื่อรวมไฟล์กลับคืนกัน บน Linux/macOS ใช้คำสั่ง cat:
cat arch.part? > arch.iso
บน Windows ใช้คำสั่ง copy:
copy /b arch.part* arch.iso
คุณสมบัติประโยชน์อื่นๆ
cURL มีฟลากและการใช้งานมากมาย:
-#– ใช้แถบความคืบหน้า แสดงความคืบหน้าของการดาวน์โหลด ตัวอย่าง:curl -# https://asite.com/somefile.zip > ~/somefile.zip-a– สั่งให้ cURL เพิ่มข้อมูลต่อท้ายไฟล์แทนการเขียนทับ ตัวอย่าง:curl -ao ~/collab-full.x https://example-url.com/collab-part26.x--head– ดึงเฉพาะ response header จากเซิร์ฟเวอร์โดยไม่มีข้อมูลเอาต์พุต เหมาะสำหรับ debug เว็บไซต์หรือดู response ที่เซิร์ฟเวอร์ запрограмม์ไว้ ตัวอย่าง:curl --head https://example-url.com--limit-rate– จำกัดแบนด์วิดท์ของการดาวน์โหลด เหมาะเมื่อไม่อยากให้ cURL ใช้แบนด์วิดท์หมด ตัวเลขเดี่ยว = bytes/วินาที K = KB/s M = MB/s ตัวอย่าง:curl --limit-rate 8M https://example-url.com/file.zip > ~/file.zip-o– กำหนดไฟล์เอาต์พุตสำหรับ cURL ตัวอย่าง:curl -o ~/Downloads/file.zip https://thefileplace.com/file.zip -o file2.zip https://thefileplace.com/file2.zip--proxy– ทำงานผ่าน proxy ตัวอย่าง:curl --proxy proxyurl:port https://example-url.com/file.zip > ~file.zip
cURL vs Wget
ทั้งคู่เปิดตัวในปีเดียวกัน (1996) cURL และ Wget ดูเหมือนโปรแกรมพี่น้อง แต่ลึกลงไป จะพบว่ามีวัตถุประสงค์ต่างกัน
Wget
- สร้างขึ้นมาเพื่อดึงข้อมูลจากอินเทอร์เน็ตโดยเฉพาะ
- ไม่ต้องใช้ฟลาก
-Lหรือ-oเหมือน cURL แค่พิมพ์wget [url]แล้วกด Enter - ดาวน์โหลดแบบ recursive ได้ทั้งโฟลเดอร์ด้วยฟลาก
-r - มีฟังก์ชันครบครันสำหรับการใช้งานประจำวันและงาน sysadmin
- (ใน Linux) ไม่ต้องการ dependency มาก มักมีให้มากับระบบแล้ว
cURL
- มีฟลากและฟังก์ชันมากมายสำหรับการดึงข้อมูลระยะไกล
- รองรับ local networking (LDAP) และ network printers (Samba)
- ทำงานได้ดีกับไลบรารีการบีบอัด gzip
- พึ่งพา libcurl ทำให้นักพัฒนาเขียนซอฟต์แวร์หรือ bash script ที่รวมฟังก์ชัน cURL ได้
สรุป: Wget เป็น "เครื่องมือของคนทั่วไป" สำหรับดึงข้อมูลจากอินเทอร์เน็ต ส่วน cURL ขยายความสามารถด้วยการควบคุมที่ละเอียดมากขึ้นสำหรับ power users และ system administrators
คำถามที่พบบ่อย
1. ได้ข้อผิดพลาดเกี่ยวกับ certificate ใน Linux ต้องแก้ไขยังไง?
หากได้ข้อผิดพลาดแบบ "peer's certificate issuer has been marked as not trusted" วิธีแก้ง่ายที่สุดคือติดตั้งแพ็กเกจ common certificates ใหม่ในดิสทริบิวชันของคุณ
Debian/Ubuntu-based:
sudo apt reinstall ca-certificates
Fedora/CentOS/RHEL:
dnf reinstall ca-certificates
Arch-based:
pacman -S ca-certificates
หมายเหตุ: ใน Arch อาจต้องล้าง package cache ด้วย pacman -Scc ก่อนติดตั้ง certificates ใหม่
หากยังมีข้อผิดพลาด อาจเป็นปัญหาที่เซิร์ฟเวอร์
2. ปลอดภัยไหมที่จะรัน cURL และ bash commands พร้อมกัน?
แม้จะไม่ใช่วิธีติดตั้งแอป Linux ที่พบบ่อย แต่นักพัฒนาบางคน (เช่นทีม NodeJS) บังคับให้ใช้ curl ร่วมกับคำสั่ง root-access ที่รันผ่าน bash (เช่น curl [argument] | sudo -E bash -) เพื่อติดตั้งซอฟต์แวร์
ดูน่ากลัว แต่ถ้านักพัฒนาซอฟต์แวร์น่าเชื่อถือ โอกาสที่จะทำให้ระบบเสียหายต่ำมาก ผู้กระทำความผิดอาจแทรกซึมเข้า repository เช่น AUR ของ Arch ได้ ดังนั้นการติดตั้งด้วย curl ร่วมกับคำสั่ง root-access จึงไม่ได้อันตรายกว่าการติดตั้งผ่าน package manager
3. ใช้ cURL กับ Tor ได้ไหม?
ได้! เริ่ม Tor Browser (หรือ standalone tor service) แล้วใช้ฟลาก --proxy Tor ให้ local proxy สำหรับซ่อน IP ในแอปพลิเคชันอื่น ตัวอย่าง cURL กับ Tor:
curl --proxy localhost:9050 https://example.com
Standalone Tor services ใช้พอร์ต 9050 ส่วน Tor Browser ใช้พอร์ต 9150
สรุป
cURL พิสูจน์ความทนทานผ่านการเปลี่ยนแปลงของโลก Linux คงตำแหน่งเป็นเครื่องมือสำคัญในอาร์เซนัลของผู้ใช้เทอร์มินัล
หากคุณใหม่กับบรรทัดคำสั่ง ดู คำสั่ง Linux ที่มีประโยชน์ที่สุด หากต้องการค้นหาบนเว็บแทนการดาวน์โหลดข้อมูล สามารถ เล่นเว็บบนเทอร์มินัลได้